﻿using System;
using System.Collections.Generic;
using System.Data;
using System.Data.OleDb;
using System.Globalization;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Web;
using System.Web.Mvc;
using System.Web.UI.WebControls;
using CRM.Database.Model;
using CRM.Models;
using DevExpress.Data;
using DevExpress.Web.ASPxEditors;
using DevExpress.Web.ASPxGridView;
using DevExpress.Web.Mvc;
using DB = CRM.Database.Model.DB;
using Excel = Microsoft.Office.Interop.Excel;
using LegalEntities = CRM.Database.Model.LegalEntities;
using Turnovers = CRM.Database.Model.Turnovers;


namespace CRM.Controllers
{
    [CheckAccess, Localize]
    public class TurnoversController : Controller
    {
        public string Log = " ";
        private static string[] Separates = new[] { " ", "г.", "-", "/", @"\", '"'.ToString(), ".", ",", "+", "ООО", "ЗАО", "зао", "ооо", "OOO", "(", ")" };

        /// <summary>
        /// 
        /// </summary>
        protected class TurnoverItem
        {
            public int Number { get; set; }
            public int SapNumber { get; set; }
            public string SapMaterialNumber { get; set; }
            public string LegalEntityName { get; set; }
            public List<string> LegalEntitiesList { get; set; }
            public string City { get; set; }
            public string Dealer { get; set; }
            public float Amount { get; set; }
            public int StringNumber { get; set; }
            public DateTime Period { get; set; }
            public float Quantity { get; set; }
            public int IdLegalEntity { get; set; }
        }

        /// <summary>
        /// Класс для сопоставления номеров колонок
        /// </summary>
        protected class DirectXlsFields
        {
            public int NumberInSap { get; set; } //Плательщик
            public int LegalEntityName { get; set; } //Плательщик имя
            public int Dealer { get; set; } //БЕ
            public int Amount { get; set; } //Оборот
            public int Period { get; set; } //ДатФактуры
            public int ProductInSap { get; set; } //Материал
            public int EndString { get; set; } //Последняя строка, до которой нужно анализировать файл
            public int Quantity { get; set; } //ФактурКолич(обрабатывается как оборот)
            public int LegalEntityForBimax { get; set; } //столбец для поиска Юр лица для БИМАКС (5 тип оборота)
        }
      
        #region TurnoversLoading

        /// <summary>
        /// 
        /// </summary>
        /// <returns></returns>
        public ActionResult Index()
        {
            List<Turnovers> tornoversFromDb = new List<Turnovers>();
            ViewData.Add("LoadingLog", Log);
            ViewData["turnoverType"] = "1";
            return View(tornoversFromDb);
        }

        /// <summary>
        /// POST метод обработки нажатия кнопки загрузки файла
        /// </summary>
        /// <param name="fileUpload"></param>
        /// <returns></returns>
        [HttpPost]
        public ActionResult Index(IEnumerable<HttpPostedFileBase> fileUpload)
        {
            //получение типа оборота
            //1 - непрямой 2 - прямой производство 3 - прямой продажи 4 - Калининград 5 - БИМАКС
            string turnoverType = Request["turnoverType"].ToString();
            ViewData["turnoverType"] = turnoverType;
            string baseDirectory = AppDomain.CurrentDomain.BaseDirectory + "UploadedTurnovers/";
            string postedFileName, resultFilePath = " ";

            //сохранение файла с рандомным именем
            foreach (var file in fileUpload)
            {
                if (file == null) continue;
                postedFileName = Path.GetFileName(file.FileName);
                string fileExtention = postedFileName.Split('.').Last();
                if (fileExtention == "xls" || fileExtention == "xlsx" || fileExtention == "XLSX" || fileExtention == "XLS")
                    resultFilePath = Guid.NewGuid() + "." + fileExtention;
                else
                {
                    return RedirectToAction("Index");
                }
                if (resultFilePath != null)
                {
                    file.SaveAs(Path.Combine(baseDirectory, resultFilePath));
                    resultFilePath = Path.Combine(baseDirectory, resultFilePath);
                }
                else
                {
                    return RedirectToAction("Index");
                }
            }

            //если файл сохранен успешно, вызов методом анализа и записи оборотов в ДБ
            if (System.IO.File.Exists(resultFilePath))
            {
                List<Turnovers> tornoversFromDb = new List<Turnovers>();
                List<TurnoverItem> turnoversList = null;

                //1 - непрямой
                Log += "Анализ оборотов:";
                if (turnoverType == "1")
                {
                    Log = "Обработка непрямого оборота:";
                    //обработка файла с оборотами
                    turnoversList = TurnoversUndirectFileValidation(resultFilePath, out Log);

                    //запись оборотов в ДБ
                    if (turnoversList != null)
                    {
                        if (!TurnoversLoadToDb(turnoversList))
                        {
                            Log += "<br />Ошибка загрузки оборотов в БД!";
                        }
                        else
                        {
                            Log += "<br /><b><font color='green'>Обороты успешно загружены в базу!</font></b>";
                        }
                    }
                }

                //2 - прямой производство
                if (turnoverType == "2")
                {
                    Log = "Обработка прямого оборота производства:";
                    //обработка файла с оборотами
                    turnoversList = TurnoversDirectProductionFileValidation(resultFilePath, out Log);
                    //запись оборотов в ДБ
                    if (turnoversList != null)
                    {
                        if (!TurnoversLoadToDb(turnoversList, 2))
                        {
                            Log += "<br />Ошибка загрузки оборотов в БД!";
                        }
                        else
                        {
                            Log += "<br /><b><font color='green'>Обороты успешно загружены в базу!</font></b>";
                        }
                    }
                }

                //3 - прямой продажи
                if (turnoverType == "3")
                {
                    Log = "Обработка прямого оборота продаж:";
                    //обработка файла с оборотами
                    turnoversList = TurnoversODBCDirectSalesFileValidation(resultFilePath, out Log);
                    //запись оборотов в ДБ
                    if (turnoversList != null)
                    {
                        if (!TurnoversLoadToDb(turnoversList, 3))
                        {
                            Log += "<br />Ошибка загрузки оборотов в БД!";
                        }
                        else
                        {
                            Log += "<br /><b><font color='green'>Обороты успешно загружены в базу!</font></b>";
                        }
                    }
                }

                //4 - Калининград
                if (turnoverType == "4")
                {
                    Log = "Обработка оборотов Калининграда:";
                    //обработка файла с оборотами
                    turnoversList = TurnoversKaliningradFileValidation(resultFilePath, out Log);
                    //запись оборотов в ДБ
                    if (turnoversList != null)
                    {
                        if (!TurnoversLoadToDb(turnoversList, 4))
                        {
                            Log += "<br />Ошибка загрузки оборотов в БД!";
                        }
                        else
                        {
                            Log += "<br /><b><font color='green'>Обороты успешно загружены в базу!</font></b>";
                        }
                    }
                }

                //5 - БИМАКС
                if (turnoverType == "5")
                {
                    Log = "Обработка оборотов для BIMAX:";
                    //обработка файла с оборотами
                    turnoversList = TurnoversBimaxDirectSalesFileValidation(resultFilePath, out Log);
                    //запись оборотов в ДБ
                    if (turnoversList != null)
                    {
                        if (!TurnoversLoadToDb(turnoversList, 5))
                        {
                            Log += "<br />Ошибка загрузки оборотов в БД!";
                        }
                        else
                        {
                            Log += "<br /><b><font color='green'>Обороты успешно загружены в базу!</font></b>";
                        }
                    }
                }

                //6 - непрямой TROCAL
                Log += "Анализ оборотов:";
                if (turnoverType == "6")
                {
                    Log = "Обработка непрямого оборота:";
                    //обработка файла с оборотами
                    turnoversList = TurnoversUndirectFileValidation(resultFilePath, out Log);

                    //запись оборотов в ДБ
                    if (turnoversList != null)
                    {
                        if (!TurnoversLoadToDb(turnoversList, 6))
                        {
                            Log += "<br />Ошибка загрузки оборотов в БД!";
                        }
                        else
                        {
                            Log += "<br /><b><font color='green'>Непрямые обороты TROCAL успешно загружены в базу!</font></b>";
                        }
                    }
                }

                ViewData.Add("LoadingLog", Log);
            //    DB.Entities = null;
                return View(tornoversFromDb);
            }

         //   DB.Entities = null;
            return RedirectToAction("Index");
        }

        /// <summary>
        /// Функция анализа Excel файла непрямых оборотов
        /// </summary>
        /// <param name="filepath">Открываемый файл</param>
        /// <param name="log">Журнал работы функции </param>
        /// <returns>Список объектов класса TurnoverItem или null, если ошибка</returns>
        private List<TurnoverItem> TurnoversUndirectFileValidation(string filepath, out string log)
        {
            #region Begin
            log = " ";
            List<TurnoverItem> turnoverItemsList = new List<TurnoverItem>();

            Excel.Application xlApp;
            Excel.Workbook xlWorkBook;
            Excel.Worksheet xlWorkSheet;
            Excel.Range range;
            int rCnt = 0;
            int cCnt = 0;

            //открытие файла
            log += "<br />Файл: <b>" + filepath + "</b>";
            xlApp = new Excel.Application();
            log += "<br />Открытие файла";
            xlWorkBook = xlApp.Workbooks.Open(filepath,
                                              0, true, 5, "", "", true,
                                              Microsoft.Office.Interop.Excel.XlPlatform.xlWindows,
                                              "\t", false, false, 0, true, 1, 0);
            xlWorkSheet = (Excel.Worksheet)xlWorkBook.Worksheets.get_Item(1);
            range = xlWorkSheet.UsedRange;
            log += "<br />Кол-во рядов:" + range.Rows.Count.ToString();
            log += "   Кол-во ячеек:" + range.Columns.Count.ToString();
            log += "<br />Обороты:";
            #endregion

            #region ValidationCycle
            ///////////////////////////////////
            //Цикл обработки записей в таблице
            ///////////////////////////////////
            bool isAllOk = true;
            for (rCnt = 2; rCnt <= range.Rows.Count; rCnt++)
            {
                bool IsOK = true;
                TurnoverItem turnoverItem = new TurnoverItem();

                log += "<br /><b>Проверка строки №" + rCnt + "</b>:";
                for (cCnt = 1; cCnt <= range.Columns.Count; cCnt++)
                {
                    //Обработка номера клиента (cCnt=1)
                    if (cCnt == 1)
                    {
                        try
                        {
                            turnoverItem.Number = TusroversCustomerNumberValidation(range.Cells.Value2[rCnt, cCnt]);
                        }
                        catch (FormatException)
                        {
                            turnoverItem.Number = -1;
                        }
                        //if (turnoverItem.Number == 0)
                        //{
                        //    log += "<br />Ошибка в ячейке [" + rCnt + "," + cCnt + "] Номер клиента не найден";
                        //    IsOK = false;
                        //    isAllOk = false;
                        //}
                        turnoverItem.StringNumber = rCnt;
                    }//конец обработки номера клиента

                    //Обработка названия Юр Лица (cCnt=2)
                    if (cCnt == 2)
                    {
                        //turnoverItem.LegalEntityName = TustoversLegalEntitiesNameValidation(range.Cells.Value2[rCnt, cCnt], turnoverItem.Number);
                        turnoverItem.LegalEntitiesList =
                            TurnoversUndirectLegalEntitiesCheck(range.Cells.Value2[rCnt, cCnt], turnoverItem.Number);
                        //Имя Юр Лица не найдено
                        if (turnoverItem.LegalEntitiesList == null)
                        {
                            log += "<br />Ошибка в ячейке [" + rCnt + "," + cCnt + "] Имя Юр. Лица не найдено";
                            IsOK = false;
                            isAllOk = false;
                            break;
                        }
                        //Найдено более одного Юр Лица 
                        if(turnoverItem.LegalEntitiesList.Count > 1 && turnoverItem.Number == 0)
                        {
                            log += "<br />Ошибка в ячейке [" + rCnt + "," + cCnt + "] Найдено более одного Юр. Лица. Необходим клиентский номер в этой строке";
                            //if (range.Cells.Value2[rCnt, cCnt] != null)
                            //    log += range.Cells.Value2[rCnt, cCnt].ToString();
                            IsOK = false;
                            isAllOk = false;
                            break;
                        }
                        if(turnoverItem.LegalEntitiesList.Count > 1)
                        {
                            log += "<br />Ошибка в ячейке [" + rCnt + "," + cCnt + "] Найдено более одного Юр. Лица.";
                            IsOK = false;
                            isAllOk = false;
                            break;
                        }
                        
                        if(turnoverItem.LegalEntitiesList.Count >= 1 && turnoverItem.Number > 0)
                        {
                            if(TustoversLegalEntitiesNameValidation(turnoverItem.LegalEntitiesList.First(), turnoverItem.Number) == null)
                            {
                                log += "<br />Ошибка в ячейке [" + rCnt + "," + cCnt + "] Не найдено Юр. Лицо с таким номером [" + turnoverItem.Number + "]";
                                IsOK = false;
                                isAllOk = false;
                                break;
                            }
                        }

                        if (turnoverItem.LegalEntitiesList.Count == 1 && turnoverItem.Number == 0)
                        {
                            turnoverItem.LegalEntityName = turnoverItem.LegalEntitiesList.First();
                        }

                        turnoverItem.LegalEntityName = turnoverItem.LegalEntitiesList.First();
                    }//конец обработки клиента

                    //Обработка города (cCnt=3)
                    if (cCnt == 3) { }

                    //Обработка Дилера (cCnt=4)
                    if (cCnt == 4)
                    {
                        turnoverItem.Dealer = TurnoversDealerValidation(range.Cells.Value2[rCnt, cCnt]);
                        if (turnoverItem.Dealer == null)
                        {
                            log += "<br />Ошибка в ячейке [" + rCnt + "," + cCnt + "] Дилер не найден";
                            IsOK = false;
                            isAllOk = false;
                            break;
                        }
                    }//конец обработки дилера

                    //Обработка оборота (cCnt=5)
                    if (cCnt == 5)
                    {
                        try
                        {
                            turnoverItem.Amount = TurnoversAmountValidation(range.Cells.Value2[rCnt, cCnt]);
                            turnoverItem.Amount = turnoverItem.Amount / (float)1.25;
                         //   turnoverItem.Amount = turnoverItem.Amount * (float)0.75;
                        }
                        catch (FormatException)
                        {
                            log += "<br />Ошибка в ячейке [" + rCnt + "," + cCnt + "] Оборотс НДС имеет неверный формат(ИСКЛЮЧЕНИЕ)";
                            IsOK = false;
                            isAllOk = false;
                            break;
                        }
                        if (turnoverItem.Amount == 0)
                        {
                            log += "<br />Ошибка в ячейке [" + rCnt + "," + cCnt + "] Оборотс НДС имеет неверный формат или равен 0";
                            IsOK = false;
                            isAllOk = false;
                            break;
                        }
                    }//конец обработки оборота

                    //Обработка даты (cCnt=6)
                    if (cCnt == 6)
                    {
                        try
                        {
                            turnoverItem.Period = TurnoversPeriodValidation(range.Cells.Value2[rCnt, cCnt]);

                        }
                        catch (Exception)
                        {
                            log += "<br />Ошибка в ячейке [" + rCnt + "," + cCnt + "] Период имеет неверный формат(ИСКЛЮЧЕНИЕ)";
                            IsOK = false;
                            isAllOk = false;
                            break;
                        }
                        if (turnoverItem.Period == new DateTime(0))
                        {
                            log += "<br />Ошибка в ячейке [" + rCnt + "," + cCnt + "] Период имеет неверный формат";
                            IsOK = false;
                            isAllOk = false;
                            break;
                        }
                        if (turnoverItem.Period > DateTime.Now)
                        {
                            log += "<br />Ошибка в ячейке [" + rCnt + "," + cCnt + "] Период имеет будущее вемя";
                            IsOK = false;
                            isAllOk = false;
                            break;
                        }
                    }//конец обработки даты

                } //конец обработки строки
                if (IsOK)
                {
                    log += " | " +
                           turnoverItem.Number + " | " +
                           turnoverItem.LegalEntityName + " | " +
                           turnoverItem.Dealer + " | " +
                           turnoverItem.Amount + " | " +
                           turnoverItem.Period + "<b> - OK</b>";

                    turnoverItemsList.Add(turnoverItem);
                }
            } //конец цикла обработки сообщений

            #endregion

            #region EndValidation
            //закрытие файла
            Log += "<br />Зактырие файла";
            xlWorkBook.Close(true, null, null);
            xlApp.Quit();

            //проверка на задвоение строк в файле
            Log += "<br />Проверка на задвоение строк: ";
            string doubleStrings = TurnoversDoubleCheck(turnoverItemsList);
            if (doubleStrings != null)
            {
                Log += "<br /><br /><b>Задвоение строк: </b>" + doubleStrings;
                isAllOk = false;
            }
            else
            {
                Log += " - OK";
            }

            //проверка на совпадение строк в базе данных
            Log += "<br />Проверка на совпадение оборота в ДБ: ";
            List<TurnoverItem> result = TurnoversGetXlsAdnDbEqual(turnoverItemsList, 1);
            if (result != null)
            {
                Log += "<br /> Совпадение строк №: ";
                isAllOk = false;
                foreach (var resultItem in result)
                {
                    Log += resultItem.StringNumber + " ";
                }
            }
            else
            {
                Log += " - OK";
            }

            if (!isAllOk)
                return null;
            Log += "<br />Проверка файла прошла успешно!";
            return turnoverItemsList;
            #endregion
        }

        /// <summary>
        /// Анализ файла прямых оборотов произвосдтва
        /// </summary>
        /// <param name="filepath"></param>
        /// <param name="log"></param>
        /// <returns></returns>
        private List<TurnoverItem> TurnoversDirectProductionFileValidation(string filepath, out string log)
        {
            #region Begin
            log = " ";
            List<TurnoverItem> turnoverItemsList = new List<TurnoverItem>();

            Excel.Application xlApp;
            Excel.Workbook xlWorkBook;
            Excel.Worksheet xlWorkSheet;
            Excel.Range range;
            int rCnt = 0;
            int cCnt = 0;

            //открытие файла
            log += "<br />Файл: <b>" + filepath + "</b>";
            xlApp = new Excel.Application();
            log += "<br />Открытие файла";
            xlWorkBook = xlApp.Workbooks.Open(filepath,
                                              0, true, 5, "", "", true,
                                              Microsoft.Office.Interop.Excel.XlPlatform.xlWindows,
                                              "\t", false, false, 0, true, 1, 0);
            xlWorkSheet = (Excel.Worksheet)xlWorkBook.Worksheets.get_Item(1);
            range = xlWorkSheet.UsedRange;
            log += "<br />Кол-во рядов:" + range.Rows.Count.ToString();
            log += "   Кол-во ячеек:" + range.Columns.Count.ToString();
            log += "<br />Обороты:";
            #endregion

            #region ValidationCycle
            ///////////////////////////////////
            //Цикл обработки записей в таблице
            ///////////////////////////////////
            bool isAllOk = true;
            for (rCnt = 2; rCnt <= range.Rows.Count; rCnt++)
            {
                bool IsOK = true;
                TurnoverItem turnoverItem = new TurnoverItem();

                log += "<br /><b>Проверка строки №" + rCnt + "</b>:";
                for (cCnt = 1; cCnt <= range.Columns.Count; cCnt++)
                {
                    //Обработка номера клиента (cCnt=1)
                    if (cCnt == 1)
                    {
                        try
                        {
                            turnoverItem.Number = TusroversCustomerNumberValidation(range.Cells.Value2[rCnt, cCnt]);
                        }
                        catch (FormatException)
                        {
                            log += "<br />Ошибка в ячейке [" + rCnt + "," + cCnt + "] Номер клиента имеет неверный формат";
                            IsOK = false;
                            isAllOk = false;
                            break;
                        }
                        if (turnoverItem.Number == 0)
                        {
                            log += "<br />Ошибка в ячейке [" + rCnt + "," + cCnt + "] Номер клиента не найден";
                            IsOK = false;
                            isAllOk = false;
                            break;
                        }
                        turnoverItem.StringNumber = rCnt;
                    }//конец обработки номера клиента

                    //Обработка названия клиента (cCnt=2)
                    if (cCnt == 2)
                    {
                        turnoverItem.LegalEntityName = TustoversLegalEntitiesNameValidation(range.Cells.Value2[rCnt, cCnt], turnoverItem.Number);
                        if (turnoverItem.LegalEntityName == null)
                        {
                            log += "<br />Ошибка в ячейке [" + rCnt + "," + cCnt + "] Имя клиента не найдено";
                            IsOK = false;
                            isAllOk = false;
                            break;
                        }
                    }//конец обработки клиента

                    //Обработка города (cCnt=3)
                    if (cCnt == 3) { }

                    //Обработка Дилера (cCnt=4)
                    if (cCnt == 4)
                    {
                        turnoverItem.Dealer = " ";
                        //turnoverItem.Dealer = TurnoversDealerValidation(range.Cells.Value2[rCnt, cCnt]);
                        //if (turnoverItem.Dealer == null)
                        //{
                        //    log += "<br />Ошибка в ячейке [" + rCnt + "," + cCnt + "] Дилер не найден";
                        //    IsOK = false;
                        //    isAllOk = false;
                        //    break;
                        //}
                    }//конец обработки дилера

                    //Обработка оборота (cCnt=5)
                    if (cCnt == 5)
                    {
                        try
                        {
                            turnoverItem.Amount = TurnoversAmountValidation(range.Cells.Value2[rCnt, cCnt]);
                            turnoverItem.Amount = turnoverItem.Amount / (float)1.18;
                        }
                        catch (FormatException)
                        {
                            log += "<br />Ошибка в ячейке [" + rCnt + "," + cCnt + "] Оборотс НДС имеет неверный формат(ИСКЛЮЧЕНИЕ)";
                            IsOK = false;
                            isAllOk = false;
                            break;
                        }
                        if (turnoverItem.Amount == 0)
                        {
                            log += "<br />Ошибка в ячейке [" + rCnt + "," + cCnt + "] Оборотс НДС имеет неверный формат или равен 0";
                            IsOK = false;
                            isAllOk = false;
                            break;
                        }
                    }//конец обработки оборота

                    //Обработка даты (cCnt=6)
                    if (cCnt == 6)
                    {
                        try
                        {
                            turnoverItem.Period = TurnoversPeriodValidation(range.Cells.Value2[rCnt, cCnt]);

                        }
                        catch (Exception)
                        {
                            log += "<br />Ошибка в ячейке [" + rCnt + "," + cCnt + "] Период имеет неверный формат(ИСКЛЮЧЕНИЕ)";
                            IsOK = false;
                            isAllOk = false;
                            break;
                        }
                        if (turnoverItem.Period == new DateTime(0))
                        {
                            log += "<br />Ошибка в ячейке [" + rCnt + "," + cCnt + "] Период имеет неверный формат";
                            IsOK = false;
                            isAllOk = false;
                            break;
                        }
                        if (turnoverItem.Period > DateTime.Now)
                        {
                            log += "<br />Ошибка в ячейке [" + rCnt + "," + cCnt + "] Период имеет будущее вемя";
                            IsOK = false;
                            isAllOk = false;
                            break;
                        }
                    }//конец обработки даты

                } //конец обработки строки
                if (IsOK)
                {
                    log += " | " +
                           turnoverItem.Number + " | " +
                           turnoverItem.LegalEntityName + " | " +
                           turnoverItem.Dealer + " | " +
                           turnoverItem.Amount + " | " +
                           turnoverItem.Period + "<b> - OK</b>";

                    turnoverItemsList.Add(turnoverItem);
                }
            } //конец цикла обработки сообщений

            #endregion

            #region EndValidation
            //закрытие файла
            Log += "<br />Зактырие файла";
            xlWorkBook.Close(true, null, null);
            xlApp.Quit();

            //проверка на задвоение строк в файле
            Log += "<br />Проверка на задвоение строк: ";
            string doubleStrings = TurnoversDoubleCheck(turnoverItemsList);
            if (doubleStrings != null)
            {
                Log += "<br /><br /><b>Задвоение строк: </b>" + doubleStrings;
                isAllOk = false;
            }
            else
            {
                Log += " - OK";
            }

            //проверка на совпадение строк в базе данных
            Log += "<br />Проверка на совпадение оборота в ДБ: ";
            List<TurnoverItem> result = TurnoversGetXlsAdnDbEqual(turnoverItemsList, 2);
            if (result != null)
            {
                Log += "<br /> Совпадение строк №: ";
                isAllOk = false;
                foreach (var resultItem in result)
                {
                    Log += resultItem.StringNumber + " ";
                }
            }
            else
            {
                Log += " - OK";
            }

            if (!isAllOk)
                return null;
            Log += "<br />Проверка файла прошла успешно!";
            return turnoverItemsList;
            #endregion
        }

        /// <summary>
        /// Анализ файла оборотов Калининграда
        /// </summary>
        /// <param name="filepath"></param>
        /// <param name="log"></param>
        /// <returns></returns>
        private List<TurnoverItem> TurnoversKaliningradFileValidation(string filepath, out string log)
        {
            #region Begin
            log = " ";
            List<TurnoverItem> turnoverItemsList = new List<TurnoverItem>();

            Excel.Application xlApp;
            Excel.Workbook xlWorkBook;
            Excel.Worksheet xlWorkSheet;
            Excel.Range range;
            int rCnt = 0;
            int cCnt = 0;

            //открытие файла
            log += "<br />Файл: <b>" + filepath + "</b>";
            xlApp = new Excel.Application();
            log += "<br />Открытие файла";
            xlWorkBook = xlApp.Workbooks.Open(filepath,
                                              0, true, 5, "", "", true,
                                              Microsoft.Office.Interop.Excel.XlPlatform.xlWindows,
                                              "\t", false, false, 0, true, 1, 0);
            xlWorkSheet = (Excel.Worksheet)xlWorkBook.Worksheets.get_Item(1);
            range = xlWorkSheet.UsedRange;
            log += "<br />Кол-во рядов:" + range.Rows.Count.ToString();
            log += "   Кол-во ячеек:" + range.Columns.Count.ToString();
            log += "<br />Обороты:";
            #endregion

            #region ValidationCycle
            ///////////////////////////////////
            //Цикл обработки записей в таблице
            ///////////////////////////////////
            bool isAllOk = true;
            for (rCnt = 2; rCnt <= range.Rows.Count; rCnt++)
            {
                bool IsOK = true;
                TurnoverItem turnoverItem = new TurnoverItem();

                log += "<br /><b>Проверка строки №" + rCnt + "</b>:";
                for (cCnt = 1; cCnt <= range.Columns.Count; cCnt++)
                {
                    //Обработка номера клиента (cCnt=1)
                    if (cCnt == 1)
                    {
                        try
                        {
                            turnoverItem.Number = TusroversCustomerNumberValidation(range.Cells.Value2[rCnt, cCnt]);
                        }
                        catch (FormatException)
                        {
                            log += "<br />Ошибка в ячейке [" + rCnt + "," + cCnt + "] Номер клиента имеет неверный формат";
                            IsOK = false;
                            isAllOk = false;
                            break;
                        }
                        if (turnoverItem.Number == 0)
                        {
                            log += "<br />Ошибка в ячейке [" + rCnt + "," + cCnt + "] Номер клиента не найден";
                            IsOK = false;
                            isAllOk = false;
                            break;
                        }
                        turnoverItem.StringNumber = rCnt;
                    }//конец обработки номера клиента

                    //Обработка названия клиента (cCnt=2)
                    if (cCnt == 2)
                    {
                        turnoverItem.LegalEntityName = TustoversLegalEntitiesNameValidation(range.Cells.Value2[rCnt, cCnt], turnoverItem.Number);
                        if (turnoverItem.LegalEntityName == null)
                        {
                            log += "<br />Ошибка в ячейке [" + rCnt + "," + cCnt + "] Имя клиента не найдено";
                            IsOK = false;
                            isAllOk = false;
                            break;
                        }
                    }//конец обработки клиента

                    //Обработка города (cCnt=3)
                    if (cCnt == 3) { }

                    //Обработка Дилера (cCnt=4)
                    if (cCnt == 4) {turnoverItem.Dealer = " ";}//конец обработки дилера

                    //Обработка оборота (cCnt=5)
                    if (cCnt == 5)
                    {
                        try
                        {
                            turnoverItem.Amount = TurnoversAmountValidation(range.Cells.Value2[rCnt, cCnt]);
                            //turnoverItem.Amount = turnoverItem.Amount / (float)1.18;
                        }
                        catch (FormatException)
                        {
                            log += "<br />Ошибка в ячейке [" + rCnt + "," + cCnt + "] Оборотс НДС имеет неверный формат(ИСКЛЮЧЕНИЕ)";
                            IsOK = false;
                            isAllOk = false;
                            break;
                        }
                        if (turnoverItem.Amount == 0)
                        {
                            log += "<br />Ошибка в ячейке [" + rCnt + "," + cCnt + "] Оборотс НДС имеет неверный формат или равен 0";
                            IsOK = false;
                            isAllOk = false;
                            break;
                        }
                    }//конец обработки оборота

                    //Обработка даты (cCnt=6)
                    if (cCnt == 6)
                    {
                        try
                        {
                            turnoverItem.Period = TurnoversPeriodValidation(range.Cells.Value2[rCnt, cCnt]);

                        }
                        catch (Exception)
                        {
                            log += "<br />Ошибка в ячейке [" + rCnt + "," + cCnt + "] Период имеет неверный формат(ИСКЛЮЧЕНИЕ)";
                            IsOK = false;
                            isAllOk = false;
                            break;
                        }
                        if (turnoverItem.Period == new DateTime(0))
                        {
                            log += "<br />Ошибка в ячейке [" + rCnt + "," + cCnt + "] Период имеет неверный формат";
                            IsOK = false;
                            isAllOk = false;
                            break;
                        }
                        if (turnoverItem.Period > DateTime.Now)
                        {
                            log += "<br />Ошибка в ячейке [" + rCnt + "," + cCnt + "] Период имеет будущее вемя";
                            IsOK = false;
                            isAllOk = false;
                            break;
                        }
                    }//конец обработки даты

                } //конец обработки строки
                if (IsOK)
                {
                    log += " | " +
                           turnoverItem.Number + " | " +
                           turnoverItem.LegalEntityName + " | " +
                           turnoverItem.Dealer + " | " +
                           turnoverItem.Amount + " | " +
                           turnoverItem.Period + "<b> - OK</b>";

                    turnoverItemsList.Add(turnoverItem);
                }
            } //конец цикла обработки сообщений

            #endregion

            #region EndValidation
            //закрытие файла
            Log += "<br />Зактырие файла";
            xlWorkBook.Close(true, null, null);
            xlApp.Quit();

            //проверка на задвоение строк в файле
            Log += "<br />Проверка на задвоение строк: ";
            string doubleStrings = TurnoversDoubleCheck(turnoverItemsList);
            if (doubleStrings != null)
            {
                Log += "<br /><br /><b>Задвоение строк: </b>" + doubleStrings;
                isAllOk = false;
            }
            else
            {
                Log += " - OK";
            }

            //проверка на совпадение строк в базе данных
            Log += "<br />Проверка на совпадение оборота в ДБ: ";
            List<TurnoverItem> result = TurnoversGetXlsAdnDbEqual(turnoverItemsList, 3);
            if (result != null)
            {
                Log += "<br /> Совпадение строк №: ";
                isAllOk = false;
                foreach (var resultItem in result)
                {
                    Log += resultItem.StringNumber + " ";
                }
            }
            else
            {
                Log += " - OK";
            }

            if (!isAllOk)
                return null;
            Log += "<br />Проверка файла прошла успешно!";
            return turnoverItemsList;
            #endregion
        }

        /// <summary>
        /// Анализ файла прямых оборотов продаж
        /// </summary>
        /// <param name="filepath">путь к файлу</param>
        /// <param name="log">лог работы метода</param>
        /// <returns>null или список оборотов</returns>
        private List<TurnoverItem> TurnoversODBCDirectSalesFileValidation(string filepath, out string log)
        {
            #region ReadFileToDataSet
            
            log = " ";
            List<TurnoverItem> turnoverItemsList = new List<TurnoverItem>();
            Excel.Application xlApp;
            Excel.Workbook xlWorkBook;
            Excel.Worksheet xlWorkSheet;
            Excel.Range range;
            int rCnt = 0;
            int cCnt = 0;
            
            //открытие файла
            string listName = GetExcelWorksheetsName(filepath)[0];
            //выбор строки подключения, в зависимости от формата файла
            string connectionString;
            string connectionString2003 = string.Format("provider=Microsoft.Jet.OLEDB.4.0;data source={0};Extended Properties=Excel 8.0;", filepath);
            string connectionString2007 = string.Format("Provider=Microsoft.ACE.OLEDB.12.0;data source={0};Extended Properties=\"Excel 12.0 Xml;HDR=YES\"", filepath);
            string[] fileFeilds = filepath.Split('.');
            int l = fileFeilds.Length;
            if (fileFeilds[l - 1] == "xls" || fileFeilds[l - 1] == "XLS")
            {
                connectionString = connectionString2003;
            }
            else
            {
                if (fileFeilds[l - 1] == "xlsx" || fileFeilds[l - 1] == "XLSX")
                {
                    connectionString = connectionString2007;
                }
                else
                {
                    return null;
                }
            }
            //формирование запроса
            string queryString = string.Format("SELECT * FROM [{0}$]", listName);
            //подключение к базе
            OleDbConnection MyConnection;
            DataSet DtSet;
            OleDbDataAdapter MyCommand;
            MyConnection = new OleDbConnection(connectionString);
            MyConnection.Open();
            MyCommand = new OleDbDataAdapter(queryString, MyConnection);
            DtSet = new System.Data.DataSet();
            //заполнение DataSet
            MyCommand.Fill(DtSet);
            //закрытие файла
            MyConnection.Close();

            #endregion

            #region ValidationCycle
            
            //сопоставление столбцов в файле
            int headerRow = 10;
            DirectXlsFields columns = TurnoversODBCDirectXlsFieldsDefinition(DtSet);
            if (columns == null)
            {
                log += "<br /><b>Ошибка поиска нужных столбцов в файле</b>";
                return null;
            }
            ///////////////////////////////////
            //Цикл обработки записей в таблице
            ///////////////////////////////////

            //цикл обработки рядов до звездобчи
            int rowNumber = 1;
            int cellNumber = 1;
            bool isAllOk = true;
            List<string> allSapMatherialNumbers = GetAllSapMatherialNumbers();
            List<string> allDealersNames;
            List<LegalEntities> allLegalEntities;
            List<int> allSapLegalEntitiesNumbers = GetAllSapLegalEntitiesNumbers();

            foreach (DataRow row in DtSet.Tables[0].Rows)
            {
                rowNumber++;
                rCnt = rowNumber;
                if (rowNumber == columns.EndString + 1)
                    break;

                //цикл обработки строки
                cellNumber = 0;
                bool IsOK = true;
                if (rowNumber > headerRow + 1)
                    log += "<br /><b>Проверка строки №" + rCnt + "</b>:";
                
                
                TurnoverItem turnoverItem = new TurnoverItem();
                turnoverItem.StringNumber = rowNumber;
                foreach (DataColumn column in DtSet.Tables[0].Columns)
                {
                    if (rowNumber <= headerRow + 1)
                    {
                        IsOK = false;
                        break;
                    }
                        
                    cellNumber++;
                    cCnt = cellNumber;
                    var cellObject = row[column];

                    //Обработка Дилера
                    if (cellNumber == columns.Dealer)
                    {
                        turnoverItem.Dealer = TurnoversDirectDealerValidation(cellObject);
                        if (turnoverItem.Dealer == null)
                        {
                            log += " - пропуск";
                            IsOK = false;
                            break;
                        }
                    }//конец обработки дилера

                    //Обработка номера клиента
                    if (cellNumber == columns.NumberInSap)
                    {
                        try
                        {
                            turnoverItem.SapNumber = TusroversSapNumberValidation(cellObject, allSapLegalEntitiesNumbers);
                        }
                        catch (FormatException)
                        {
                            log += "<br />Ошибка в ячейке [" + rCnt + "," + cCnt + "] Номер клиента SAP имеет неверный формат";
                            IsOK = false;
                            isAllOk = false;
                            break;
                        }
                        //проверка на исключения SAP номеров
                        if (!CheckForExceptions(cellObject.ToString()))
                        {
                            IsOK = false;
                            log += "Исключение - пропуск";
                            break;
                        }
                        if (turnoverItem.SapNumber == 0)
                        {
                            log += "<br />Ошибка в ячейке [" + rCnt + "," + cCnt + "] Номер клиента SAP не найден в БД [<b>" + cellObject.ToString() + "</b>]";
                            IsOK = false;
                            isAllOk = false;
                            break;
                        }
                    }//конец обработки номера клиента
                    
                    //Обработка названия клиента
                    if (cellNumber == columns.LegalEntityName)
                    {
                        turnoverItem.LegalEntityName = cellObject.ToString();
                    }//конец обработки клиента

                    //Обработка оборота
                    if (cellNumber == columns.Amount)
                    {
                        if (cellObject == null || cellObject.ToString() == "")
                        {
                            log += "<br />ПРОПУСК! - Ошибка в ячейке [" + rCnt + "," + cCnt + "] Оборотс НДС имеет неверный формат или равен 0 - этот оборот не будет загружен";
                            IsOK = false;
                            //isAllOk = false;
                        }
                        else
                        {
                            try
                            {
                                turnoverItem.Amount = TurnoversDirectAmountValidation(cellObject);
                            }
                            catch (FormatException)
                            {
                                log += "<br />Ошибка в ячейке [" + rCnt + "," + cCnt + "] Оборотс НДС имеет неверный формат(ИСКЛЮЧЕНИЕ)";
                                IsOK = false;
                                isAllOk = false;
                                //break;
                            }
                            if (turnoverItem.Amount == 0)
                            {
                                log += "<br />ПРОПУСК! - Ошибка в ячейке [" + rCnt + "," + cCnt + "] Оборотс НДС имеет неверный формат или равен 0 - этот оборот не будет загружен";
                                IsOK = false;
                                //isAllOk = false;
                                //break;
                            }
                        }
                    }//конец обработки оборота

                    //Обработка даты (cCnt=6)
                    if (cellNumber == columns.Period)
                    {
                        try
                        {
                            turnoverItem.Period = TurnoversPeriodValidation(cellObject);
                        }
                        catch (Exception)
                        {
                            log += "<br />Ошибка в ячейке [" + rCnt + "," + cCnt + "] Период имеет неверный формат(ИСКЛЮЧЕНИЕ)";
                            IsOK = false;
                            isAllOk = false;
                            //break;
                        }
                        if (turnoverItem.Period == new DateTime(0))
                        {
                            log += "<br />Ошибка в ячейке [" + rCnt + "," + cCnt + "] Период имеет неверный формат";
                            IsOK = false;
                            isAllOk = false;
                            //break;
                        }
                        if (turnoverItem.Period > DateTime.Now)
                        {
                            log += "<br />Ошибка в ячейке [" + rCnt + "," + cCnt + "] Период имеет будущее вемя";
                            IsOK = false;
                            isAllOk = false;
                            //break;
                        }
                    }//конец обработки даты

                    //Обработка номера материала
                    if (cellNumber == columns.ProductInSap)
                    {
                        string sapMaterialTmp = cellObject as string;

                        if(!string.IsNullOrEmpty(sapMaterialTmp))
                        {
                            if(sapMaterialTmp.Length<8)
                            {
                                sapMaterialTmp = "00" + sapMaterialTmp;
                            }
                        }

                        cellObject = sapMaterialTmp;

                        turnoverItem.SapMaterialNumber = TustoversDirectSapMaterialNamberValidation(cellObject, allSapMatherialNumbers);
                        if (turnoverItem.SapMaterialNumber == null)
                        {
                            if (cellObject != null)
                            {
                                log += "<br />Ошибка в ячейке [" + rCnt + "," + cCnt + "] Номер материала SAP [<b>" + cellObject.ToString() + "</b>] не найден в БД";
                            }
                            else
                            {
                                log += "<br />Ошибка в ячейке [" + rCnt + "," + cCnt + "] Номер материала SAP отсутствует";
                            }
                            IsOK = false;
                            isAllOk = false;
                            break;
                        }
                    }//конец обработки номера материала

                    //Обработка кол-во фактур
                    if (cellNumber == columns.Quantity)
                    {
                        if (cellObject == null || cellObject.ToString() == "")
                        {
                            turnoverItem.Quantity = 0;
                        }
                        else
                        {
                            try
                            {
                                turnoverItem.Quantity = TurnoversDirectAmountValidation(cellObject);
                            }
                            catch (FormatException)
                            {
                                turnoverItem.Quantity = 0;
                            }
                        }
                    }//конец обработки кол-ва фактур

                }//конец обработки строки
                if (IsOK)
                {
                    log += " | " +
                           turnoverItem.SapNumber + " | " +
                           turnoverItem.LegalEntityName + " | " +
                           turnoverItem.Dealer + " | " +
                           turnoverItem.Amount + " | " +
                           turnoverItem.Period + " | " +
                           turnoverItem.SapMaterialNumber + " | " +
                           turnoverItem.Quantity + "<b> - OK</b>";

                    turnoverItemsList.Add(turnoverItem);
                }
            }
            #endregion

            #region EndValidation
            ////проверка на задвоение строк в файле
            //Log += "<br />Проверка на задвоение строк: ";
            //string doubleStrings = TurnoversDoubleCheck(turnoverItemsList, true);
            //if (doubleStrings != null)
            //{
            //    Log += "<br /><b>Задвоение строк: </b>" + doubleStrings;
            //    isAllOk = false;
            //}
            //else
            //{
            //    Log += " - OK";
            //}
            
            //получение списка всех прямых оборотов из базы для сравнения
            List<TurnoverItem> allDiredtTurnoversFromDb = GetAllDirectTurnovers();
            
            //проверка на совпадение строк в базе данных
            Log += "<br />Проверка на совпадение оборотов в ДБ: ";
            List<TurnoverItem> result = TurnoversDirectGetXlsAdnDbEqual(turnoverItemsList, allDiredtTurnoversFromDb);
            if (result != null)
            {
                Log += "<br /><b> Совпадение строк №: </b> ";
                isAllOk = false;
                foreach (var resultItem in result)
                {
                    Log += resultItem.StringNumber + " ";
                }
            }
            else
            {
                Log += " - OK";
            }

            if (!isAllOk)
                return null;
            Log += "<br />Проверка файла прошла успешно!";
            return turnoverItemsList;
            #endregion
        }

        /// <summary>
        /// Анализ файла прямых оборотов продаж для Бимакс
        /// </summary>
        /// <param name="filepath">путь к файлу</param>
        /// <param name="log">лог работы метода</param>
        /// <returns>null или список оборотов</returns>
        private List<TurnoverItem> TurnoversBimaxDirectSalesFileValidation(string filepath, out string log)
        {
            #region ReadFileToDataSet

            log = " ";
            List<TurnoverItem> turnoverItemsList = new List<TurnoverItem>();
            Excel.Application xlApp;
            Excel.Workbook xlWorkBook;
            Excel.Worksheet xlWorkSheet;
            Excel.Range range;
            int rCnt = 0;
            int cCnt = 0;

            //открытие файла
            string listName = GetExcelWorksheetsName(filepath)[0];
            //выбор строки подключения, в зависимости от формата файла
            string connectionString;
            string connectionString2003 = string.Format("provider=Microsoft.Jet.OLEDB.4.0;data source={0};Extended Properties=Excel 8.0;", filepath);
            string connectionString2007 = string.Format("Provider=Microsoft.ACE.OLEDB.12.0;data source={0};Extended Properties=\"Excel 12.0 Xml;HDR=YES\"", filepath);
            string[] fileFeilds = filepath.Split('.');
            int l = fileFeilds.Length;
            if (fileFeilds[l - 1] == "xls" || fileFeilds[l - 1] == "XLS")
            {
                connectionString = connectionString2003;
            }
            else
            {
                if (fileFeilds[l - 1] == "xlsx" || fileFeilds[l - 1] == "XLSX")
                {
                    connectionString = connectionString2007;
                }
                else
                {
                    return null;
                }
            }
            //формирование запроса
            string queryString = string.Format("SELECT * FROM [{0}$]", listName);
            //подключение к базе
            OleDbConnection MyConnection;
            DataSet DtSet;
            OleDbDataAdapter MyCommand;
            MyConnection = new OleDbConnection(connectionString);
            MyConnection.Open();
            MyCommand = new OleDbDataAdapter(queryString, MyConnection);
            DtSet = new System.Data.DataSet();
            //заполнение DataSet
            MyCommand.Fill(DtSet);
            //закрытие файла
            MyConnection.Close();

            #endregion

            #region ValidationCycle

            //сопоставление столбцов в файле
            int headerRow = 10;
            DirectXlsFields columns = TurnoversBimaxODBCDirectXlsFieldsDefinition(DtSet);
            if (columns == null)
            {
                log += "<br /><b>Ошибка поиска нужных столбцов в файле</b>";
                return null;
            }
            ///////////////////////////////////
            //Цикл обработки записей в таблице
            ///////////////////////////////////

            //цикл обработки рядов до звездобчи
            int rowNumber = 1;
            int cellNumber = 1;
            bool isAllOk = true;
            List<string> allDealersNames;
            List<LegalEntities> allLegalEntities;
            List<string> allSapMatherialNumbers = GetAllSapMatherialNumbers();

            foreach (DataRow row in DtSet.Tables[0].Rows)
            {
                rowNumber++;
                rCnt = rowNumber;
                if (rowNumber == columns.EndString + 1)
                    break;

                //цикл обработки строки
                cellNumber = 0;
                bool IsOK = true;
                if (rowNumber > headerRow + 1)
                    log += "<br /><b>Проверка строки №" + rCnt + "</b>:";


                TurnoverItem turnoverItem = new TurnoverItem();
                turnoverItem.StringNumber = rowNumber;
                foreach (DataColumn column in DtSet.Tables[0].Columns)
                {
                    if (rowNumber <= headerRow + 1)
                    {
                        IsOK = false;
                        break;
                    }

                    cellNumber++;
                    cCnt = cellNumber;
                    var cellObject = row[column];

                    //Обработка Дилера
                    if (cellNumber == columns.Dealer)
                    {
                        turnoverItem.Dealer = TurnoversDirectDealerValidation(cellObject);
                        if (turnoverItem.Dealer == null)
                        {
                            log += " - пропуск";
                            IsOK = false;
                            break;
                        }
                    }//конец обработки дилера



                    //Обработка названия клиента
                    if (cellNumber == columns.LegalEntityForBimax)
                    {
                        if(cellObject != null)
                        {
                            turnoverItem.LegalEntityName = cellObject.ToString();
                            turnoverItem.IdLegalEntity = GetIdBimaxLegalEntityByName(turnoverItem.LegalEntityName);
                        }
                        if(turnoverItem.IdLegalEntity == 0)
                        {
                            log += "<br />Ошибка в ячейке [" + rCnt + "," + cCnt + "] Имя Юр. Лица не найдено.";
                            IsOK = false;
                            isAllOk = false;
                            //break;
                        }
                    }//конец обработки клиента

                    //Обработка оборота
                    if (cellNumber == columns.Amount)
                    {
                        if (cellObject == null || cellObject.ToString() == "")
                        {
                            log += "<br />ПРОПУСК! - Ошибка в ячейке [" + rCnt + "," + cCnt + "] Оборотс НДС имеет неверный формат или равен 0 - этот оборот не будет загружен";
                            IsOK = false;
                            //isAllOk = false;
                        }
                        else
                        {
                            try
                            {
                                turnoverItem.Amount = TurnoversDirectAmountValidation(cellObject);
                            }
                            catch (FormatException)
                            {
                                log += "<br />Ошибка в ячейке [" + rCnt + "," + cCnt + "] Оборотс НДС имеет неверный формат(ИСКЛЮЧЕНИЕ)";
                                IsOK = false;
                                isAllOk = false;
                                //break;
                            }
                            if (turnoverItem.Amount == 0)
                            {
                                log += "<br />ПРОПУСК! - Ошибка в ячейке [" + rCnt + "," + cCnt + "] Оборотс НДС имеет неверный формат или равен 0 - этот оборот не будет загружен";
                                IsOK = false;
                                //isAllOk = false;
                                //break;
                            }
                        }
                    }//конец обработки оборота

                    //Обработка даты (cCnt=6)
                    if (cellNumber == columns.Period)
                    {
                        try
                        {
                            turnoverItem.Period = TurnoversPeriodValidation(cellObject);
                        }
                        catch (Exception)
                        {
                            log += "<br />Ошибка в ячейке [" + rCnt + "," + cCnt + "] Период имеет неверный формат(ИСКЛЮЧЕНИЕ)";
                            IsOK = false;
                            isAllOk = false;
                            //break;
                        }
                        if (turnoverItem.Period == new DateTime(0))
                        {
                            log += "<br />Ошибка в ячейке [" + rCnt + "," + cCnt + "] Период имеет неверный формат";
                            IsOK = false;
                            isAllOk = false;
                            //break;
                        }
                        if (turnoverItem.Period > DateTime.Now)
                        {
                            log += "<br />Ошибка в ячейке [" + rCnt + "," + cCnt + "] Период имеет будущее вемя";
                            IsOK = false;
                            isAllOk = false;
                            //break;
                        }
                    }//конец обработки даты

                    //Обработка номера материала
                    if (cellNumber == columns.ProductInSap)
                    {
                        string sapMaterialTmp = cellObject as string;

                        if (!string.IsNullOrEmpty(sapMaterialTmp))
                        {
                            if (sapMaterialTmp.Length < 8)
                            {
                                sapMaterialTmp = "00" + sapMaterialTmp;
                            }
                        }

                        cellObject = sapMaterialTmp;

                        turnoverItem.SapMaterialNumber = TustoversDirectSapMaterialNamberValidation(cellObject, allSapMatherialNumbers);
                        if (turnoverItem.SapMaterialNumber == null)
                        {
                            if (cellObject != null)
                            {
                                log += "<br />Ошибка в ячейке [" + rCnt + "," + cCnt + "] Номер материала SAP [<b>" + cellObject.ToString() + "</b>] не найден в БД";
                            }
                            else
                            {
                                log += "<br />Ошибка в ячейке [" + rCnt + "," + cCnt + "] Номер материала SAP отсутствует";
                            }
                            IsOK = false;
                            isAllOk = false;
                            break;
                        }
                    }//конец обработки номера материала

                    //Обработка кол-во фактур
                    if (cellNumber == columns.Quantity)
                    {
                        if (cellObject == null || cellObject.ToString() == "")
                        {
                            turnoverItem.Quantity = 0;
                        }
                        else
                        {
                            try
                            {
                                turnoverItem.Quantity = TurnoversDirectAmountValidation(cellObject);
                            }
                            catch (FormatException)
                            {
                                turnoverItem.Quantity = 0;
                            }
                        }
                    }//конец обработки кол-ва фактур

                }//конец обработки строки
                if (IsOK)
                {
                    log += " | " +
                           turnoverItem.SapNumber + " | " +
                           turnoverItem.LegalEntityName + " | " +
                           turnoverItem.Dealer + " | " +
                           turnoverItem.Amount + " | " +
                           turnoverItem.Period + " | " +
                           turnoverItem.SapMaterialNumber + " | " +
                           turnoverItem.Quantity + "<b> - OK</b>";

                    turnoverItemsList.Add(turnoverItem);
                }
            }
            #endregion

            #region EndValidation
            
            //получение списка всех прямых оборотов из базы для сравнения
            //List<TurnoverItem> allDiredtTurnoversFromDb = GetAllDirectTurnovers();

            //проверка на совпадение строк в базе данных
            Log += "<br />Проверка на совпадение оборотов в ДБ: - отменена для этого типа оборотов ";
            //List<TurnoverItem> result = TurnoversDirectGetXlsAdnDbEqual(turnoverItemsList, allDiredtTurnoversFromDb);
            //if (result != null)
            //{
            //    Log += "<br /><b> Совпадение строк №: </b> ";
            //    isAllOk = false;
            //    foreach (var resultItem in result)
            //    {
            //        Log += resultItem.StringNumber + " ";
            //    }
            //}
            //else
            //{
            //    Log += " - OK";
            //}

            if (!isAllOk)
                return null;
            Log += "<br />Проверка файла прошла успешно!";
            return turnoverItemsList;
            #endregion
        }

        /// <summary>
        /// Возвращает ID Юр Лиц для БИМАКСА по имени
        /// </summary>
        /// <param name="legalEntityName"></param>
        /// <returns></returns>
        private int GetIdBimaxLegalEntityByName(string legalEntityName)
        {
            switch (legalEntityName.ToUpper().Trim())
            {
                case "ЕВРООКНА-МОСКВА": {return 10088;}
                case "ЕВРООКНА-ВОЛГОГРАД": { return 10089; }
                case "ЕВРООКНА-ИЖЕВСК": { return 10090; }
                case "ЕВРООКНА-КАЗАНЬ": { return 10091; }
                case "ЕВРООКНА-КРАСНОЯРС": { return 10092; }
                case "ЕВРООКНА-РОСТОВ": { return 10093; }
                case "ЕВРООКНА-САМАРА": { return 10094; }
                case "ЕВРООКНА-СПБ": { return 10095; }
                case "ЕВРООКНА-НН":
                    {
                        return 10097;
                    }
                case "ЕВРООКНА-ВОРОНЕЖ":
                    return 10098;
            }
            return 0;
        }

        /// <summary>
        /// проверяет совпадение номеров с теми, обороты которых загружать не нужно. 
        /// </summary>
        /// <param name="customerSapNumber"></param>
        /// <returns></returns>
        private bool CheckForExceptions(string customerSapNumber)
        {
            string ex1 = "204000080";
            if(customerSapNumber.Trim().ToUpper() == ex1)
                return false;
            return true;
        }

        /// <summary>
        /// Находит в Excel файле все листы и возвращает массив имен этих листов
        /// </summary>
        /// <param name="ExcelFileName">Имя Excel файла</param>
        /// <returns>Масив имен листов файла</returns>
        public static string[] GetExcelWorksheetsName(string ExcelFileName)
        {
            string[] Names = null;

            Excel.Application ExApp = null;
            Excel.Workbook ExWB = null;

            try
            {
                ExApp = new Excel.Application();
                ExWB = ExApp.Workbooks.Open(ExcelFileName, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value);
                Names = new string[ExWB.Worksheets.Count];
                int i = 0;
                foreach (Excel.Worksheet ExWS in ExWB.Worksheets)
                {
                    Names[i] = ExWS.Name;
                    i++;
                }
                ExWB.Close(Missing.Value, ExcelFileName, Missing.Value);
                ExWB = null;
                ExApp.Quit();
                ExApp = null;
            }
            catch (Exception ex)
            {
                // MessageBox.Show(ex.Message, "Поиск имен листов", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            finally
            {
                if (ExWB != null)
                {
                    ExWB.Close(null, ExcelFileName, null);
                    ExWB = null;
                }
                if (ExApp != null)
                {
                    ExApp.Quit();
                    ExApp = null;
                }
                //Ускоряем удаление объектов из памяти.
                GC.Collect();
            }
            return Names;
        }
        
        /// <summary>
        /// Анализ номера клиента профайн РУС
        /// </summary>
        /// <param name="objNumber">ячейка из файла</param>
        /// <returns>номер профайн РУС или 0</returns>
        protected int TusroversCustomerNumberValidation(Object objNumber)
        {
            int customerNumber = Convert.ToInt32(objNumber);
            if (customerNumber > 0)
            {
                var col = new LegalEntitiesCollection();
                if (Enumerable.Any(col.LegalEntitiesList, entity => entity.SequentialNumber == customerNumber))
                {
                    return customerNumber;
                }
            }
            return 0;
        }

        /// <summary>
        /// Анализ номера SAP
        /// </summary>
        /// <param name="objNumber"></param>
        /// <returns></returns>
        protected int TusroversSapNumberValidation(Object objNumber)
        {
            int sapNumber = Convert.ToInt32(objNumber);
            if (sapNumber > 0)
            {
                var col = new LegalEntitiesCollection();
                if (Enumerable.Any(col.LegalEntitiesList, entity => entity.NumberInSAP == sapNumber))
                {
                    return sapNumber;
                }
            }
            return 0;
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="cellObject"></param>
        /// <param name="allSapLegalEntitiesNumbers"></param>
        /// <returns></returns>
        private int TusroversSapNumberValidation(object cellObject, List<int> allSapLegalEntitiesNumbers)
        {
            var saplNumber = Convert.ToInt32(cellObject);
            if (saplNumber > 0)
            {
                foreach (var number in allSapLegalEntitiesNumbers)
                {
                    if (number == saplNumber)
                        return number;
                }
            }
            return 0;
        }

        /// <summary>
        /// Проверка номера материала
        /// </summary>
        /// <param name="objNumber">ячейка</param>
        /// <returns>номер материала</returns>
        protected int TusroversProductNumberValidation(Object objNumber)
        {
            int sapNumber = Convert.ToInt32(objNumber);
            if (sapNumber > 0)
            {
                var prodCol = new ProductsCollection();
                if (Enumerable.Any(prodCol.ProductsList, entity => entity.SAPMaterialNumber.Trim() == sapNumber.ToString().Trim()))
                {
                    return sapNumber;
                }
            }
            return 0;
        }

        /// <summary>
        /// Удаление разделителей
        /// </summary>
        /// <param name="str"></param>
        /// <returns></returns>
        private static string RemoveSeparators(string str)
        {
            var _result = new StringBuilder(str);

            _result = Separates.Aggregate(_result, (current, sep) => current.Replace(sep, ""));

            return _result.ToString();
        }

        /// <summary>
        /// Анализ имени клиента
        /// </summary>
        /// <param name="objName"></param>
        /// <returns></returns>
        protected string TustoversLegalEntitiesNameValidation(Object objName)
        {
            var col = new LegalEntitiesCollection();
            string customerName;
            if (objName is string)
            {
                customerName = (string)objName;

                if (customerName.Contains("/"))
                {
                    customerName = customerName.Split('/').First();
                    

                    foreach (var entity in
                        col.LegalEntitiesList.Where(entity => customerName.Trim().ToUpper() == entity.Name.ToUpper()))
                    {
                        return entity.Name;
                    }
                }

                if (customerName.Contains("("))
                {
                    customerName = customerName.Split('(').First();
                    return Enumerable.FirstOrDefault((from entity in col.LegalEntitiesList
                                                      where customerName.Trim().ToUpper() == entity.Name.ToUpper().Split('(').First().Trim()
                                                      select entity.Name));
                }
                else
                {
                    return Enumerable.FirstOrDefault((from entity in col.LegalEntitiesList
                                                      where customerName.Trim().ToUpper() == entity.Name.Trim().ToUpper()
                                                      select entity.Name));
                }
            }
            return null;
        }

        /// <summary>
        /// Проверка Юр. Лиц
        /// </summary>
        /// <param name="objName"></param>
        /// <param name="seqlNumber"></param>
        /// <returns></returns>
        protected List<string> TurnoversUndirectLegalEntitiesCheck(Object objName, int seqlNumber)
        {
            var result = new List<string>();
            string customerName;
            var col = new LegalEntitiesCollection();
            if (objName is string)
            {
                customerName = (string)objName;
                foreach (var entity in col.LegalEntitiesList)
                {
                    if (customerName.Trim().ToUpper() == entity.Name.Trim().ToUpper())
                    {
                        result.Add(entity.Name);
                    }
                }

                if (result.Count >= 1 && seqlNumber == 0)
                    return result;

                if (result.Count == 1 && seqlNumber >= 0)
                    return result;

                //Если найдены совпадающие Юр. Лица и номер клиента больше 0

                if (result.Count > 1 && seqlNumber > 0)
                {
                    var custCol = new CustomersCollection();
                    var customerItem = custCol.GetCustomerBySequentalNumber(seqlNumber);
                    if (customerItem != null)
                    {
                        foreach (var entity in customerItem.LegalEntities.Where(entity => customerName.ToUpper().Trim() == entity.Name.ToUpper().Trim()))
                        {
                            return new List<string> {entity.Name};
                        }
                    }
                }
            }
            return null;
        }

        /// <summary>
        /// Анализ имени клиента
        /// </summary>
        /// <param name="objName"></param>
        /// <param name="seqlNumber"></param>
        /// <returns></returns>
        protected string TustoversLegalEntitiesNameValidation(Object objName, int seqlNumber)
        {
            var custCol = new CustomersCollection();
            string customerName;
            var customerItem = custCol.GetCustomerBySequentalNumber(seqlNumber);
            if (customerItem != null)
            {
                if (objName is string)
                {
                    customerName = (string)objName;
                    foreach (var entity in
                        //customerItem.LegalEntities.Where(entity => RemoveSeparators(customerName).ToUpper().Trim() == RemoveSeparators(entity.Name).ToUpper().Trim()))
                        customerItem.LegalEntities.Where(entity => customerName.ToUpper().Trim() == entity.Name.ToUpper().Trim()))
                    {
                        return entity.Name;
                    }

                    if (customerName.Contains("/"))
                    {
                        customerName = customerName.Split('/').First();
                        foreach (var entity in
                            //customerItem.LegalEntities.Where(entity => RemoveSeparators(customerName).ToUpper().Trim() == RemoveSeparators(entity.Name).ToUpper().Trim()))
                            customerItem.LegalEntities.Where(entity => customerName.ToUpper().Trim() == entity.Name.ToUpper().Trim()))
                        {
                            return entity.Name;
                        }
                    }

                    if (customerName.Contains("("))
                    {
                        customerName = customerName.Split('(').First();
                        return (from entity in customerItem.LegalEntities
                                //where RemoveSeparators(customerName).ToUpper().Trim() == RemoveSeparators(entity.Name).ToUpper().Trim()
                                where customerName.ToUpper().Trim() == entity.Name.ToUpper().Trim()
                                select entity.Name).FirstOrDefault();
                    }
                    else
                    {
                        foreach (var entity in customerItem.LegalEntities)
                        {
                            if (customerName.Trim().ToUpper() == entity.Name.Trim().ToUpper())
                            {
                                return entity.Name;
                            }
                        }
                    }
                }
            }
            return null;
        }

        /// <summary>
        /// Анализ имени клиента
        /// </summary>
        /// <param name="objName"></param>
        /// <returns></returns>
        protected List<string> TurnoversUndirectLegalEntitiesCheck(Object objName)
        {
            var result = new List<string>();
            string customerName;

            if (objName is string)
            {
                var col = new LegalEntitiesCollection();
                customerName = (string)objName;
                foreach (var entity in col.LegalEntitiesList)
                {
                    if (customerName.Trim().ToUpper() == entity.Name.Trim().ToUpper())
                    {
                        result.Add(entity.Name);
                    }
                }
            }
            return null;
        }
        
        /// <summary>
        /// Анализ имени дилера
        /// </summary>
        /// <param name="objDealerName"></param>
        /// <returns>Имя дилера или null</returns>
        protected string TurnoversDealerValidation(Object objDealerName)
        {
           // throw new NotImplementedException();

            if (objDealerName is string)
            {
                var col = new LegalEntitiesCollection();
                int customerItem = col.GetIdByName((string)objDealerName);
                if (customerItem != 0)
                    return objDealerName.ToString();
            }
            return null;
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="objAmount"></param>
        /// <returns>true если тип числовой и > 0</returns>
        protected float TurnoversAmountValidation(Object objAmount)
        {
            float result;
            if (objAmount is double || objAmount is int || objAmount is float || objAmount is long)
            {
                result = (float)Convert.ToDecimal(objAmount);
                if (result != 0)
                    return result;
            }
            return 0;
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="objPeriod"></param>
        /// <returns></returns>
        protected DateTime TurnoversPeriodValidation(Object objPeriod)
        {
            if (objPeriod is double)
                return DateTime.FromOADate(Convert.ToDouble(objPeriod));
            if (objPeriod is string)
                return DateTime.Parse(objPeriod.ToString().Trim());
            return new DateTime(0);
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="list"></param>
        /// <param name="isDirect"></param>
        /// <returns>Строка совпадающих номеров строк</returns>
        protected string TurnoversDoubleCheck(List<TurnoverItem> list, bool isDirect = false)
        {
            string result = null;
            if (isDirect)
            {
                foreach (var item1 in list)
                {
                    foreach (var item2 in list)
                    {
                        if (item1.SapNumber == item2.SapNumber &&
                            item1.Dealer == item2.Dealer &&
                            item1.Amount == item2.Amount &&
                            item1.Period == item2.Period &&
                            item1.SapMaterialNumber == item2.SapMaterialNumber)
                        {
                            if (item1.StringNumber != item2.StringNumber)
                            {
                                result += item1.StringNumber + "  ";
                            }
                        }
                    }
                }
                return result;
            }
            else
            {
                foreach (var item1 in list)
                {
                    foreach (var item2 in list)
                    {
                        if (item1.Number == item2.Number &&
                            item1.LegalEntityName == item2.LegalEntityName &&
                            item1.Dealer == item2.Dealer &&
                            item1.Amount == item2.Amount &&
                            item1.Period == item2.Period)
                        {
                            if (item1.StringNumber != item2.StringNumber)
                            {
                                result += item1.StringNumber + "  ";
                            }
                        }
                    }
                }
                return result;
            }
        }

        /// <summary>
        /// Проверка совпадения оборотов с базой.
        /// </summary>
        /// <param name="turnoversList"></param>
        /// <param name="turnoverClassification">1 - непрямые обороты 2 - прямой производство 3 - прямой продажи</param>
        /// <returns>Лист совпадающих оборотов или null если все ОК</returns>
        protected List<TurnoverItem> TurnoversGetXlsAdnDbEqual(List<TurnoverItem> turnoversList, int turnoverClassification)
        {
            var col = new TurnoversCollection();
            var result = new List<TurnoverItem>();
            foreach (var fromDBItem in col.TurnoversList)
            {
                foreach (var fromXlsItem in turnoversList)
                {
                    //непрямой оборот KBE
                    if (turnoverClassification == 1)
                    {
                        if (fromDBItem != null)
                        {
                            if (fromDBItem.IdProductMark == 1)
                            {
                                if (fromDBItem.LegalEntities != null)
                                {
                                    if (fromXlsItem.Number == fromDBItem.LegalEntities.SequentialNumber)
                                        if (fromXlsItem.LegalEntityName == fromDBItem.LegalEntities.Name)
                                            if (fromXlsItem.Amount == fromDBItem.Amount)
                                                if (fromXlsItem.Period == fromDBItem.Period)
                                                {
                                                    if (fromDBItem.DealerLegalEntity != null)
                                                        if (fromXlsItem.Dealer == fromDBItem.DealerLegalEntity.Name)
                                                            if (!result.Contains(fromXlsItem)) result.Add(fromXlsItem);
                                                    if (!result.Contains(fromXlsItem)) result.Add(fromXlsItem);
                                                }
                                }
                            }
                        }
                    }

                    //непрямой оборот TROCAL
                    if (turnoverClassification == 6)
                    {
                        if (fromDBItem != null)
                        {
                            if (fromDBItem.IdProductMark == 2)
                            {
                                if (fromDBItem.LegalEntities != null)
                                {
                                    if (fromXlsItem.Number == fromDBItem.LegalEntities.SequentialNumber)
                                        if (fromXlsItem.LegalEntityName == fromDBItem.LegalEntities.Name)
                                            if (fromXlsItem.Amount == fromDBItem.Amount)
                                                if (fromXlsItem.Period == fromDBItem.Period)
                                                {
                                                    if (fromDBItem.DealerLegalEntity != null)
                                                        if (fromXlsItem.Dealer == fromDBItem.DealerLegalEntity.Name)
                                                            if (!result.Contains(fromXlsItem)) result.Add(fromXlsItem);
                                                    if (!result.Contains(fromXlsItem)) result.Add(fromXlsItem);
                                                }
                                }
                            }
                        }
                    }
                    
                    //прямой производство
                    if (turnoverClassification == 2) 
                    {
                        if (fromDBItem != null)
                            if (fromDBItem.LegalEntities != null)
                                if (fromXlsItem.Number == fromDBItem.LegalEntities.SequentialNumber &&
                                    fromXlsItem.LegalEntityName == fromDBItem.LegalEntities.Name &&
                                    fromXlsItem.Amount == fromDBItem.Amount &&
                                    fromXlsItem.Period == fromDBItem.Period)
                                {
                                    if (!result.Contains(fromXlsItem)) result.Add(fromXlsItem);
                                }
                    }

                    //прямой продажи
                    if (turnoverClassification == 3)
                    {
                        if (fromDBItem != null)
                            if (fromDBItem.DealerLegalEntity != null)
                                if (fromDBItem.LegalEntities != null)
                                    if (fromXlsItem.LegalEntityName == fromDBItem.LegalEntities.Name &&
                                        fromXlsItem.Dealer == fromDBItem.DealerLegalEntity.Name &&
                                        fromXlsItem.Amount == fromDBItem.Amount &&
                                        fromXlsItem.Period == fromDBItem.Period)
                                    {
                                        if (!result.Contains(fromXlsItem)) result.Add(fromXlsItem);
                                    }
                    }
                }//конец вложенного foreach
            }//конец внешнего foreach
            
            if (result.Count == 0)
                return null;
            return result;
        }

        /// <summary>
        /// проверка совпадений оборотов
        /// </summary>
        /// <param name="turnoversList"></param>
        /// <param name="allDiredtTurnoversFromDb"></param>
        /// <returns></returns>
        protected List<TurnoverItem> TurnoversDirectGetXlsAdnDbEqual(List<TurnoverItem> turnoversList, List<TurnoverItem> allDiredtTurnoversFromDb)
        {
            var result = new List<TurnoverItem>();

            foreach (var itemFromDb in allDiredtTurnoversFromDb)
            {
                foreach (var itemFromXls in turnoversList)
                {
                    if(itemFromXls.SapNumber == itemFromDb.SapNumber &&
                        itemFromXls.SapMaterialNumber == itemFromDb.SapMaterialNumber &&
                        itemFromXls.Amount == itemFromDb.Amount &&
                        itemFromXls.Period == itemFromDb.Period &&
                        itemFromXls.Dealer == itemFromDb.Dealer)
                    {
                        if (!result.Contains(itemFromXls)) result.Add(itemFromXls);
                    }
                }
            }

            if (result.Count == 0)
                return null;
            return result;
        }

        /// <summary>
        /// Загрузка списка оборотов в базу Если будет Exeption, то виноват Гриша
        /// </summary>
        /// <param name="turnoversList">Список проверенных оборотов из Xls файла</param>
        /// <param name="turnoverClassification">Классификация оборота: 1-Непрямой 2-Прямой-производство 3-Прямой-продажи</param>
        /// <returns>True - при успешном копировании</returns>
        protected bool TurnoversLoadToDb(List<TurnoverItem> turnoversList, int turnoverClassification = 1)
        {
          //  throw new NotImplementedException();

            var col = new CustomersCollection();
            var leCol = new LegalEntitiesCollection();
            var prodCol = new ProductsCollection();
            var turnCol = new TurnoversCollection();


            List<CRM.Database.Model.Turnovers> listTurnovers = new List<Turnovers>();
            for (int index = 0; index < turnoversList.Count; index++)
            {
                var turnoverFromXlsItem = turnoversList[index];
                try
                {
                    Turnovers item = new Turnovers();
                    item.Amount = turnoverFromXlsItem.Amount; //добавление в объект оборота
                    item.Period = turnoverFromXlsItem.Period; //добавление в объект периода

                    item.IdTurnoverClassification = turnoverClassification; //ID классификации оборота

                    //  var col = new CustomersCollection();
                    //для непрямого оборота
                    if (turnoverClassification == 1 || turnoverClassification == 6)
                    {
                        var dealerLegalEntityItem = col.GetDealerByName(turnoverFromXlsItem.Dealer).LegalEntities.FirstOrDefault(c => c.Name == turnoverFromXlsItem.Dealer);
                        if (dealerLegalEntityItem != null)
                        {
                            item.IdDealerLegalEntity = dealerLegalEntityItem.IdLegalEntity; //добавление ID юр лица 
                        }
                        if (turnoverFromXlsItem.Number > 0)
                        {
                            var customerLegalEntityItem = col.GetCustomerBySequentalNumber(turnoverFromXlsItem.Number).GetLegalEntityByName(turnoverFromXlsItem.LegalEntityName, false);
                            if (customerLegalEntityItem != null)
                            {
                                item.IdLegalEntity = customerLegalEntityItem.IdLegalEntity;
                            }
                            else
                            {
                            }
                        }
                        else
                        {
                            LegalEntities legalEntiryNameItem;
                            //    var leCol = new LegalEntitiesCollection();
                            legalEntiryNameItem =
                                (LegalEntities) leCol.GetItemByName(turnoverFromXlsItem.LegalEntityName);
                            if (legalEntiryNameItem != null)
                            {
                                item.IdLegalEntity = legalEntiryNameItem.IdLegalEntity;
                            }
                        }

                        //запись KBE----------------------
                        if (turnoverClassification == 1)
                        {
                            item.IdProductMark = 1;
                        }
                        //запись TROCAL-------------------
                        if (turnoverClassification == 6)
                        {
                            item.IdTurnoverClassification = 1;
                            item.IdProductMark = 2;
                        }
                    }

                    //для прямого производства
                    if (turnoverClassification == 2)
                    {
                        item.IdLegalEntity = col.GetCustomerBySequentalNumber(turnoverFromXlsItem.Number).
                            GetLegalEntityByName(turnoverFromXlsItem.LegalEntityName).IdLegalEntity;
                    }

                    //добавление для оборота прямой-продажи
                    if (turnoverClassification == 3)
                    {
                        LegalEntities dealerItem = (LegalEntities) leCol.GetItemByName(turnoverFromXlsItem.Dealer);
                        if (dealerItem == null)
                        {
                            return false;
                        }

                        item.IdDealerLegalEntity = dealerItem.IdLegalEntity;

                        //item.IdDealerLegalEntity = DB.GetDealerByName(turnoverFromXlsItem.Dealer).GetLegalEntityByName(turnoverFromXlsItem.Dealer).IdLegalEntity;//добавление ID юр лица

                        LegalEntities legalEntityTmp = leCol.GetLegalEntityBySapNumber(turnoverFromXlsItem.SapNumber);
                        if (legalEntityTmp != null)
                        {
                            item.IdLegalEntity = legalEntityTmp.IdLegalEntity;
                            //var productItem = DB.GetProductbySapMaterialNumber(turnoverFromXlsItem.SapMaterialNumber);
                            //  var prodCol = new ProductsCollection();
                            var productItem = prodCol.GetProductBySAPNumber(turnoverFromXlsItem.SapMaterialNumber);
                            if (productItem == null)
                            {
                                return false;
                            }
                            item.IdProduct = productItem.IdProduct;
                        }
                        if (turnoverFromXlsItem.Quantity > 0)
                            item.Quantity = turnoverFromXlsItem.Quantity;
                    }


                    //г. Калининград
                    if (turnoverClassification == 4)
                    {
                        item.IdTurnoverClassification = 3;
                        item.IdLegalEntity = col.GetCustomerBySequentalNumber(turnoverFromXlsItem.Number).
                            GetLegalEntityByName(turnoverFromXlsItem.LegalEntityName).IdLegalEntity;
                        item.IdDealerLegalEntity = 51;

                        //Max - KBE
                        //
                        item.IdProductMark = 1;
                        /////
                    }

                    //БИМАКС
                    if (turnoverClassification == 5)
                    {
                        //Max - KBE
                        //
                        item.IdProductMark = 1;
                        /////


                        //определение типа
                        item.IdTurnoverClassification = 3;

                        //определение дилера
                        //  var leCol = new LegalEntitiesCollection();
                        var dealerItem = (LegalEntities) leCol.GetItemByName(turnoverFromXlsItem.Dealer);
                        if (dealerItem == null)
                        {
                            return false;
                        }
                        item.IdDealerLegalEntity = dealerItem.IdLegalEntity;

                        //определение Юр. Лица БИМАКС
                        item.IdLegalEntity = turnoverFromXlsItem.IdLegalEntity;

                        //запись продукта
                        //  var prodCol = new ProductsCollection();
                        var productItem = prodCol.GetProductBySAPNumber(turnoverFromXlsItem.SapMaterialNumber);
                        if (productItem == null)
                        {
                            return false;
                        }
                        item.IdProduct = productItem.IdProduct;
                        if (turnoverFromXlsItem.Quantity > 0)
                            item.Quantity = turnoverFromXlsItem.Quantity;
                    }

                    if (turnoverClassification > 6)
                    {
                        return false;
                    }
                    listTurnovers.Add(item);
                }
                catch (Exception)
                {
                    return false;
                }
            }
            //проверка на нулевые значения
            if (true)//listTurnovers.Any(turnover => turnover.IdLegalEntity == null || turnover.IdTurnoverClassification == null))
            {
                foreach (var turnover in listTurnovers)
                {
                    if (turnover.IdLegalEntity == null)
                    {
                        return false;
                    }
                    if (turnover.IdTurnoverClassification == null)
                    {
                        return false;
                    }
                }
                //  return false;
            }
            //запись оборотов в базу
         //   DB.Entities.Configuration.AutoDetectChangesEnabled = false;

        //    var turnCol = new TurnoversCollection();
            //foreach (var turnover in listTurnovers)
            //{
            //    turnCol.Add(turnover, Request.LogonUserIdentity.Name);
            //}

            turnCol.AddTurnoversCollection(listTurnovers, Request.LogonUserIdentity.Name);

          //  DB.Entities.Configuration.AutoDetectChangesEnabled = false;

          //  DB.Save();
            return true;
        }

        /// <summary>
        /// Заполняет класс DirectXlsFields номерами толбцов
        /// </summary>
        /// <param name="rangeXls"></param>
        /// <param name="firstRow">Анализируемый ряд (по умолчанию = 11)</param>
        /// <param name="isDirect"></param>
        /// <param name="starColumn"></param>
        /// <returns>номера столбцов или null если не все имена столбцов найдены</returns>
        protected DirectXlsFields TurnoversDirectXlsFieldsDefinition(Excel.Range rangeXls, bool isDirect = false, int firstRow = 11, int starColumn = 2)
        {
            var result = new DirectXlsFields();

            if (isDirect)
            {
                for (int cCnt = 1; cCnt <= rangeXls.Columns.Count; cCnt++)
                {
                    if (rangeXls.Cells.Value2[firstRow, cCnt] != null)
                    {
                        string cell = rangeXls.Cells.Value2[firstRow, cCnt].ToString();
                        string cellRes = cell.Trim().ToUpper();
                        switch (cellRes)
                        {
                            //Номер столбца номера клиента SAP
                            case "ПЛАТЕЛЬЩИК":
                                {
                                    result.NumberInSap = cCnt;
                                    break;
                                }
                            //Номер столбца Юр Лица
                            case "ПЛАТЕЛЬЩИК ИМЯ":
                                {
                                    result.LegalEntityName = cCnt;
                                    break;
                                }
                            //Номер столбца периода
                            case "ДАТФАКТУРЫ":
                                {
                                    result.Period = cCnt;
                                    break;
                                }

                            //Номер столбца дилера
                            case "БЕ":
                                {
                                    result.Dealer = cCnt;
                                    break;
                                }

                            //Номер столбца номера клиента SAP
                            case "ОБРВЛВНКРС":
                                {
                                    result.Amount = cCnt;
                                    break;
                                }

                            //Номер столбца номера материала в SAP
                            case "МАТЕРИАЛ":
                                {
                                    result.ProductInSap = cCnt;
                                    break;
                                }

                            //ФактурКолич
                            case "ФАКТУРКОЛИЧ":
                                {
                                    result.Quantity = cCnt;
                                    break;
                                }
                        }
                    }//конец проверка на null
                }//конец анализа строки заголовков

                for (int rCnt = 1; rCnt <= rangeXls.Rows.Count; rCnt++)
                {
                    if (rangeXls.Cells.Value2[rCnt, starColumn] != null)
                    {
                        string endString = rangeXls.Cells.Value2[rCnt, starColumn].ToString();
                        if (endString.Trim() == "*")
                        {
                            result.EndString = rCnt - 2;
                            break;
                        }
                    }
                }

                if (result.Amount > 0 &&
                    result.Dealer > 0 &&
                    result.NumberInSap > 0 &&
                    result.Period > 0 &&
                    result.Quantity > 0 &&
                    result.ProductInSap > 0)
                {
                    return result;
                }
                else
                {
                    return null;
                }
            }
            return null;
        }

        /// <summary>
        /// Заполняет класс DirectXlsFields номерами толбцов
        /// </summary>
        /// <param name="dtSet"></param>
        /// <returns>номера столбцов или null если не все имена столбцов найдены</returns>
        protected DirectXlsFields TurnoversODBCDirectXlsFieldsDefinition(DataSet dtSet)
        {
            var result = new DirectXlsFields();

            int ceellNumber = 1;
            int rowNumber = 1;
            foreach (DataColumn column in dtSet.Tables[0].Columns)
            {
                var obj = dtSet.Tables[0].Rows[8][column];
                if (obj != null)
                {
                    string cell = obj.ToString();
                    string cellRes = cell.Trim().ToUpper();
                    switch (cellRes)
                    {
                            //Номер столбца номера клиента SAP
                        case "ПЛАТЕЛЬЩИК":
                            {
                                result.NumberInSap = ceellNumber;
                                break;
                            }
                            //Номер столбца Юр Лица
                        case "ПЛАТЕЛЬЩИК ИМЯ":
                            {
                                result.LegalEntityName = ceellNumber;
                                break;
                            }
                            //Номер столбца периода
                        case "ДАТФАКТУРЫ":
                            {
                                result.Period = ceellNumber;
                                break;
                            }

                            //Номер столбца дилера
                        case "БЕ":
                            {
                                result.Dealer = ceellNumber;
                                break;
                            }

                            //Номер столбца номера клиента SAP
                        case "ОБРВЛВНКРС":
                            {
                                result.Amount = ceellNumber;
                                break;
                            }

                            //Номер столбца номера материала в SAP
                        case "МАТЕРИАЛ":
                            {
                                result.ProductInSap = ceellNumber;
                                break;
                            }

                        //ФактурКолич
                        case "ФАКТУРКОЛИЧ":
                            {
                                result.Quantity = ceellNumber;
                                break;
                            }

                        //Юр лицо для БИМАКС
                        case "№ ЗАКАЗА НА ПОСТАВКУ":
                            {
                                result.LegalEntityForBimax = ceellNumber;
                                break;
                            }
                    }
                    ceellNumber++;
                }
            }

            rowNumber = 1;
            foreach (DataRow row in dtSet.Tables[0].Rows)
            {
                rowNumber++;
                foreach (DataColumn column in dtSet.Tables[0].Columns)
                {
                    var endString = row[column].ToString();
                    if (endString.Trim() == "*")
                    {
                        result.EndString = rowNumber - 2;
                        break;
                    }
                }
            }
            if (result.Amount > 0 &&
                result.Dealer > 0 &&
                result.NumberInSap > 0 &&
                result.Period > 0 &&
                result.ProductInSap > 0 &&
                result.Quantity > 0 &&
                result.EndString > 0)
            {
                return result;
            }
            else
            {
                return null;
            }
        }

        /// <summary>
        /// Заполняет класс DirectXlsFields номерами толбцов
        /// </summary>
        /// <param name="dtSet"></param>
        /// <returns>номера столбцов или null если не все имена столбцов найдены</returns>
        protected DirectXlsFields TurnoversBimaxODBCDirectXlsFieldsDefinition(DataSet dtSet)
        {
            var result = new DirectXlsFields();

            int ceellNumber = 1;
            int rowNumber = 1;
            foreach (DataColumn column in dtSet.Tables[0].Columns)
            {
                var obj = dtSet.Tables[0].Rows[8][column];
                if (obj != null)
                {
                    string cell = obj.ToString();
                    string cellRes = cell.Trim().ToUpper();
                    switch (cellRes)
                    {
                            //Номер столбца номера клиента SAP
                        case "ПЛАТЕЛЬЩИК":
                            {
                                result.NumberInSap = ceellNumber;
                                break;
                            }
                            //Номер столбца Юр Лица
                        case "ПЛАТЕЛЬЩИК ИМЯ":
                            {
                                result.LegalEntityName = ceellNumber;
                                break;
                            }
                            //Номер столбца периода
                        case "ДАТФАКТУРЫ":
                            {
                                result.Period = ceellNumber;
                                break;
                            }

                            //Номер столбца дилера
                        case "БЕ":
                            {
                                result.Dealer = ceellNumber;
                                break;
                            }

                            //Номер столбца номера клиента SAP
                        case "ОБРВЛВНКРС":
                            {
                                result.Amount = ceellNumber;
                                break;
                            }

                            //Номер столбца номера материала в SAP
                        case "МАТЕРИАЛ":
                            {
                                result.ProductInSap = ceellNumber;
                                break;
                            }

                        //ФактурКолич
                        case "ФАКТУРКОЛИЧ":
                            {
                                result.Quantity = ceellNumber;
                                break;
                            }

                        //Юр лицо для БИМАКС
                        case "№ ЗАКАЗА НА ПОСТАВКУ":
                            {
                                result.LegalEntityForBimax = ceellNumber;
                                break;
                            }
                    }
                    ceellNumber++;
                }
            }

            rowNumber = 1;
            foreach (DataRow row in dtSet.Tables[0].Rows)
            {
                rowNumber++;
                foreach (DataColumn column in dtSet.Tables[0].Columns)
                {
                    var endString = row[column].ToString();
                    if (endString.Trim() == "*")
                    {
                        result.EndString = rowNumber - 2;
                        break;
                    }
                }
            }
            if (result.Amount > 0 &&
                result.Dealer > 0 &&
                result.NumberInSap > 0 &&
                result.Period > 0 &&
                result.ProductInSap > 0 &&
                result.Quantity > 0 &&
                result.EndString > 0 &&
                result.LegalEntityForBimax > 0)
            {
                return result;
            }
            else
            {
                return null;
            }
        }

        /// <summary>
        /// Валидация Юр Лица по имени и номеру САП
        /// </summary>
        /// <param name="objName">объект имени Юр Лица из XLS</param>
        /// <param name="numberInSap">номер САП</param>
        /// <returns>Имя Юр Лица или null</returns>
        protected string TustoversDirectLegalEntitiesNameValidation(Object objName, int numberInSap)
        {
            var col = new LegalEntitiesCollection();
            LegalEntities result = col.GetLegalEntityBySapNumber(numberInSap);
            if (result != null)
            {
                if (result.Name != null)
                    return result.Name;
                return "NONAME";
            }
            return null;
        }

        /// <summary>
        /// Проверка наличия в базе номера материала САП
        /// </summary>
        /// <param name="objMaterialNumber"></param>
        /// <returns>Номер материала САП или null</returns>
        protected string TustoversDirectSapMaterialNamberValidation(Object objMaterialNumber)
        {
            var col = new ProductsCollection();
            string sapNumber = objMaterialNumber.ToString();
            return Enumerable.FirstOrDefault((from entity in col.ProductsList 
                                              where entity.SAPMaterialNumber.Trim() == sapNumber.Trim()
                                              select entity.SAPMaterialNumber));
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="objMaterialNumber"></param>
        /// <param name="listSapMatherialNumbers"></param>
        /// <returns></returns>
        protected string TustoversDirectSapMaterialNamberValidation(Object objMaterialNumber, List<string> listSapMatherialNumbers)
        {
            string materialNumber = objMaterialNumber.ToString();
            foreach (var sapMatherialNumber in listSapMatherialNumbers)
            {
                if (sapMatherialNumber.Trim().ToUpper() == materialNumber.Trim().ToUpper())
                    return sapMatherialNumber;
            }
            return null;
        }

        /// <summary>
        /// Валидация прямого оборота
        /// </summary>
        /// <param name="objAmount">Объект оборота их XLS</param>
        /// <returns>Оборот или 0</returns>
        protected float TurnoversDirectAmountValidation(Object objAmount)
        {
            float result;
            if(objAmount != null)
            {
                string resultStr = objAmount.ToString().Trim().Replace(".", "");
                result = (float)Convert.ToDecimal(resultStr);
                if (result != 0)
                    return result;
            }
            return 0;
        }

        /// <summary>
        /// Валидация номера дилера
        /// </summary>
        /// <param name="objDealerName"></param>
        /// <returns>Имя дилера или null</returns>
        protected string TurnoversDirectDealerValidation(Object objDealerName)
        {
            //LegalEntities dealerItem;
            //string dealerName = " ";

            ////try
            ////{
            //    if (objDealerName is double || objDealerName is int || objDealerName is float || objDealerName is long)
            //    {
            //        int dealerNum = 0;
            //        dealerNum = (int)Convert.ToDecimal(objDealerName);
            //        if (dealerNum == 80)
            //            dealerName = "профайн РУС";
            //        if (dealerNum == 10)
            //            dealerName = "профайн Германия";
            //        dealerItem = DB.GetDealerLegalEntityByName(dealerName, false);
            //        if (dealerItem != null)
            //            return dealerItem.Name;
            //    }
            //    if(objDealerName is string)
            //    {
            //        if (objDealerName.ToString() == "80")
            //            dealerName = "профайн РУС";
            //        if (objDealerName.ToString() == "10")
            //            dealerName = "профайн Германия";
            //      //  dealerItem = DB.GetDealerLegalEntityByName(dealerName, false);
            //        dealerItem = DB.GetLegalEntityByName(dealerName);
            //        if (dealerItem != null)
            //            return dealerItem.Name;
            //    }
            ////}
            ////catch (Exception)
            ////{
            ////    return null;
            ////}

            //return null;
             if (objDealerName.ToString() == "80")
                 return  "профайн РУС";
             if (objDealerName.ToString() == "10")
                 return "профайн Германия";
            return null;

        }

        /// <summary>
        /// Возвращает список всех SAP номеров материала
        /// </summary>
        /// <returns></returns>
        List<string> GetAllSapMatherialNumbers()
        {
            var col = new ProductsCollection();
            var result = new List<string>();
            foreach (var product in col.ProductsList)
            {
                result.Add(product.SAPMaterialNumber);
            }
            return result;
        }

        /// <summary>
        /// Возвращает список всех SAP номеров клиентов 
        /// </summary>
        /// <returns></returns>
        List<int> GetAllSapLegalEntitiesNumbers()
        {
            var col = new LegalEntitiesCollection();
            var result = new List<int>();
            foreach (var legalEntity in col.LegalEntitiesList)
            {
                if(legalEntity.NumberInSAP>0)
                    if (legalEntity.NumberInSAP != null) result.Add((int) legalEntity.NumberInSAP);
            }
            return result;
        }

        /// <summary>
        /// Возвращает список прямых оборотов
        /// </summary>
        /// <returns></returns>
        List<TurnoverItem> GetAllDirectTurnovers()
        {
            var col = new TurnoversCollection();
            var result = new List<TurnoverItem>();

            foreach (var turnoverFromDb in col.TurnoversList)
            {
                if(turnoverFromDb.IdTurnoverClassification == 3)
                {
                    var tempTurnover = new TurnoverItem();
                    
                    //номе клиента
                    tempTurnover.Number = turnoverFromDb.ClientSequentalNumber;

                    //имя дилера
                    if (turnoverFromDb.DealerName != null)
                        tempTurnover.Dealer = turnoverFromDb.DealerName;

                    //SAP номер материала
                    if (turnoverFromDb.Products != null)
                        if (turnoverFromDb.Products.SAPMaterialNumber != null)
                            tempTurnover.SapMaterialNumber = turnoverFromDb.Products.SAPMaterialNumber;

                    //оборот
                    tempTurnover.Amount = turnoverFromDb.Amount;

                    //Период
                    tempTurnover.Period = turnoverFromDb.Period;

                    //номер клиента SAP
                    if (turnoverFromDb.LegalEntities != null)
                        if (turnoverFromDb.LegalEntities.NumberInSAP != null)
                            tempTurnover.SapNumber = (int) turnoverFromDb.LegalEntities.NumberInSAP;

                    result.Add(tempTurnover);
                }
            }

            return result;
        }
        
        #endregion

        #region FilterTurnovers

       

        /// <summary>
        /// Обработка фильтра в отчёте "Все обороты"
        /// </summary>
        /// <returns>Результат фильтрования</returns>
        //[HttpPost]
        //public ActionResult AllTurnovers()
        //{
        //    List<Turnovers> filtredTurnovers = null;

        //    int selectedRegionId = Convert.ToInt32(Request.Form["IdProfineRegion_VI"]);
        //    DateTime periodStart = Convert.ToDateTime(Request.Form["PeriodStart"]);
        //    DateTime periodEnd = Convert.ToDateTime(Request.Form["PeriodEnd"]);
           
        //    filtredTurnovers = DB.GetTurnoversBetweenDates(periodStart, periodEnd, DB.Turnovers);
        //    filtredTurnovers = DB.GetTurnoversByRegionId(selectedRegionId, filtredTurnovers);
            


        //  //  return View("AllTurnovers", null);
        //    return View("AllTurnovers",  filtredTurnovers);

        //}

        #endregion
      
        #region AllTurnovers

  /// <summary>
        /// 
        /// </summary>
        /// <returns></returns>
        public ActionResult AllTurnovers()
  {
           var col = new TurnoversCollection();
            //  var d = DB.TurnoverClassificationsActive.Where(p => p.IdTurnoverClassification == 2);
            //  ViewBag.StartTime = DateTime.Now.TimeOfDay.ToString();
           var col1 = PermissionsManager.GetTrueTurnoversByUserName(User.Identity.Name);
            //  ViewBag.EndTime = DateTime.Now.TimeOfDay.ToString();


            return View(col1);
        }

        /// <summary>
        /// 
        /// </summary>
        /// <returns></returns>
        public ActionResult AllTurnoversPartial()
        {
           
         return PartialView("AllTurnoversPartial",  PermissionsManager.GetTrueTurnoversByUserName(User.Identity.Name));
            
        }

#endregion
        
        #region Haedler_P

        public ActionResult Haendler_P()
        {
            var col =  PermissionsManager.GetTrueTurnoversByUserName(User.Identity.Name);
            return View(col);
        }

        public ActionResult Haendler_PPartial()
        {
            var col = PermissionsManager.GetTrueTurnoversByUserName(User.Identity.Name);
            return PartialView("Haendler_PPartial", col);
        }

        #endregion

        #region Novices

        public ActionResult Novicies()
        {

            return View(PermissionsManager.GetNovisesFilteredByUserAccess(User.Identity.Name));
        }


        public ActionResult NovicesPartial()
        {


            return PartialView("NovicesPartial", PermissionsManager.GetNovisesFilteredByUserAccess(User.Identity.Name));
        }

        #endregion

        public ActionResult Umsatz()
        {
            var col = PermissionsManager.GetTrueTurnoversByUserName(User.Identity.Name);
            return View(col);
        }

        public ActionResult UmsatzPartial()
        {
            var col = PermissionsManager.GetTrueTurnoversByUserName(User.Identity.Name);
            return PartialView("UmsatzPartial", col);
        }

        public ActionResult ExportTo()
        {
         return   GridViewExtension.ExportToXls(CustomerCreateExportGridViewSettings(), PermissionsManager.GetTrueTurnoversByUserName(User.Identity.Name));
            //return GridViewExtension.WriteXls(CustomerCreateExportGridViewSettings(),)
            //return new EmptyResult();
            RedirectToAction("AllTurnovers");
        }

        static GridViewSettings CustomerCreateExportGridViewSettings()
        {
            GridViewSettings settings = new GridViewSettings();
            settings.Name = "gdTurnovers";
            settings.SettingsPager.PageSize = 20;
            settings.KeyFieldName = "IdTurnover";
            settings.CallbackRouteValues = new { Controller = "Turnovers", Action = "AllTurnoversPartial" };
            settings.Settings.ShowFilterBar = GridViewStatusBarMode.Visible;




            settings.Settings.ShowFilterRow = true;
            settings.Settings.ShowGroupPanel = true;


            settings.Columns.Add(column =>
            {
                column.Caption = Resourses.Resourses.Year;
                column.FieldName = "Year";
            });

            settings.Columns.Add(column =>
            {
                column.Caption = Resourses.Resourses.Month;
                column.FieldName = "Month";
            });


            //settings.Columns.Add(column =>
            //{
            //    column.Caption = Resourses.TurnoversAmount;
            //    column.FieldName = "EuroAmount";
            //    column.PropertiesEdit.DisplayFormatString = "euro";
            //});



            settings.Columns.Add(column =>
            {
                column.Caption = Resourses.Resourses.TurnoversAmount;
                column.FieldName = "Amount";
                column.Visible = true;
                // column.PropertiesEdit.DisplayFormatString = "c";
                //column.SetDataItemTemplateContent(c=>
                //                                      {
                //                                          ViewContext.Writer.Write(c.DataItem.ToString("euro"));
                //                                      });

            });


            settings.Columns.Add(column =>
            {
                column.Caption = Resourses.Resourses.Article;
                column.FieldName = "ArticleText";
                column.Visible = true;



            });

            settings.Columns.Add(column =>
            {
                column.Caption = Resourses.Resourses.ProductSystems;
                column.FieldName = "ProductSystemName";
                column.Visible = true;



            });

            settings.Columns.Add(column =>
            {
                column.Caption = Resourses.Resourses.ProductMark;
                column.FieldName = "ProductMark";
                column.Visible = true;



            });

            settings.Columns.Add(column =>
            {
                column.FieldName = "IdTurnoverClassification";
                column.Caption = Resourses.Resourses.TurnoverClassifications;
                column.ColumnType = MVCxGridViewColumnType.ComboBox;

                var comboBoxProperties = column.PropertiesEdit as ComboBoxProperties;
                if (comboBoxProperties != null)
                {
                    var col = new TurnoverClassificationsCollection();

                    comboBoxProperties.DataSource = col.TurnoverClassificationsList;
                    comboBoxProperties.TextField = "LocalizedName";
                    comboBoxProperties.ValueField = "IdTurnoverClassification";
                    comboBoxProperties.ValueType = typeof(int);
                }
            });

            settings.Columns.Add(column =>
            {
                column.Caption = Resourses.Resourses.CustomerNumber;
                column.FieldName = "ClientSequentalNumber";//"IdLegalEntity";

            });

            settings.Columns.Add(column =>
            {
                column.Caption = Resourses.Resourses.CustomerName;
                column.FieldName = "CustomerName";//"IdLegalEntity";

            });

            settings.Columns.Add(column =>
            {
                column.Caption = Resourses.Resourses.LegalEntityName;
                column.FieldName = "LegalEntityName";//"IdLegalEntity";

            });

            settings.Columns.Add(column =>
            {
                column.Caption = Resourses.Resourses.customerManager;
                column.FieldName = "ManagerName";
            });

            settings.Columns.Add(column =>
            {
                column.Caption = Resourses.Resourses.customerRegion;
                column.FieldName = "CustomerProfineRegion";

                //column.ColumnType = MVCxGridViewColumnType.ComboBox;

                //var comboBoxProperties = column.PropertiesEdit as ComboBoxProperties;
                //if (comboBoxProperties != null)
                //{

                //    comboBoxProperties.DataSource =
                //        DB.GetLocalizedProfineRegionsNames(Thread.CurrentThread.CurrentCulture.ToString());
                //    comboBoxProperties.TextField = "LocaLizedString";
                //    comboBoxProperties.ValueField = "Id";
                //    comboBoxProperties.ValueType = typeof(int);
                //}
            });

            settings.Columns.Add(column =>
            {
                column.Caption = Resourses.Resourses.customerDistrict;
                column.FieldName = "CustomerRegion";//"IdLegalEntity";

            });


            settings.Columns.Add(column =>
            {
                column.Caption = Resourses.Resourses.customerCity;
                column.FieldName = "CustomerCity";//"IdLegalEntity";

            });







            settings.Columns.Add(column =>
            {
                column.Caption = Resourses.Resourses.DealerLegalName;
                column.FieldName = "DealerLegalName";
            });

            settings.Columns.Add(column =>
            {
                column.Caption = Resourses.Resourses.Dealer;
                column.FieldName = "DealerName";
            });

            settings.Columns.Add(column =>
            {
                column.Caption = Resourses.Resourses.DealerProfineRegion;
                column.FieldName = "DealerProfineRegionName";
            });

            settings.Columns.Add(column =>
            {
                column.Caption = Resourses.Resourses.DealerCity;
                column.FieldName = "DealerCity";
            });




            settings.TotalSummary.Add(SummaryItemType.Sum, "Amount").DisplayFormat = Resourses.Resourses.Total + ": {0:c}";


            settings.GroupSummary.Add(SummaryItemType.Sum, "Amount").DisplayFormat = Resourses.Resourses.Total + ": {0:c}";

            settings.CustomColumnDisplayText = (sender, e) =>
            {

                if (e.Column.FieldName == "Amount")
                {


                    e.DisplayText = ((float)e.Value).ToString("c", CultureInfo.CreateSpecificCulture("fr-FR"));



                }
            };
            settings.SummaryDisplayText = (sender, e) =>
            {
                if (e.Item.FieldName == "Amount")
                {
                    decimal value;
                    decimal.TryParse(e.Value.ToString(), out value);
                    e.Text = Resourses.Resourses.Total + ": " + value.ToString("c", CultureInfo.CreateSpecificCulture("fr-FR"));
                    // e.Text = value.ToString("euro", null);
                }
            };




            settings.SettingsEditing.Mode = GridViewEditingMode.EditFormAndDisplayRow;
            settings.Width = Unit.Percentage(100);
            settings.Settings.ShowFooter = true;
            settings.PreRender = (sender, e) =>
            {
                MVCxGridView gridView = sender as MVCxGridView;
                if (gridView != null)
                    gridView.FilterExpression = "Year > 2011";
            };
            return settings;
        }
        
        public ActionResult AllDirectTurnovers()
        {
            return View("AllDirectTurnovers", PermissionsManager.GetAllDirectTurnoversFilteredByUserAccess(User.Identity.Name));
        }

        public ActionResult AllDirectTurnoversPartial()
        {
            return PartialView("AllDirectTurnoversPartial", PermissionsManager.GetAllDirectTurnoversFilteredByUserAccess(User.Identity.Name));
        }
    }
}


///// <summary>
///// Анализ файла прямых оборотов продаж
///// </summary>
///// <param name="filepath">путь к файлу</param>
///// <param name="log">лог работы метода</param>
///// <returns>null или список оборотов</returns>
//private List<TurnoverItem> TurnoversDirectSalesFileValidation(string filepath, out string log)
//{
//    #region Begin
//    log = " ";
//    List<TurnoverItem> turnoverItemsList = new List<TurnoverItem>();

//    Excel.Application xlApp;
//    Excel.Workbook xlWorkBook;
//    Excel.Worksheet xlWorkSheet;
//    Excel.Range range;
//    int rCnt = 0;
//    int cCnt = 0;

//    //открытие файла
//    log += "<br />Файл: <b>" + filepath + "</b>";
//    xlApp = new Excel.Application();
//    log += "<br />Открытие файла";
//    xlWorkBook = xlApp.Workbooks.Open(filepath,
//                                      0, true, 5, "", "", true,
//                                      Microsoft.Office.Interop.Excel.XlPlatform.xlWindows,
//                                      "\t", false, false, 0, true, 1, 0);
//    xlWorkSheet = (Excel.Worksheet)xlWorkBook.Worksheets.get_Item(1);
//    range = xlWorkSheet.UsedRange;
//    log += "<br />Кол-во рядов:" + range.Rows.Count.ToString();
//    log += "   Кол-во ячеек:" + range.Columns.Count.ToString();
//    log += "<br />Обороты:";
//    #endregion

//    #region ValidationCycle
//    //сопоставление столбцов в файле
//    int headerRow = 11;
//    DirectXlsFields columns = TurnoversDirectXlsFieldsDefinition(range, true, headerRow);
//    if (columns == null)
//    {
//        log += "<br /><b>Ошибка поиска нужных столбцов в файле</b>";
//        return null;
//    }

//    ///////////////////////////////////
//    //Цикл обработки записей в таблице
//    ///////////////////////////////////

//    bool isAllOk = true;
//    for (rCnt = headerRow + 2; rCnt <= columns.EndString; rCnt++)
//    {
//        bool IsOK = true;
//        TurnoverItem turnoverItem = new TurnoverItem();

//        log += "<br /><b>Проверка строки №" + rCnt + "</b>:";
//        for (cCnt = 1; cCnt <= range.Columns.Count; cCnt++)
//        {
//            //Обработка Дилера (cCnt=4)
//            if (cCnt == columns.Dealer)
//            {
//                turnoverItem.Dealer = TurnoversDirectDealerValidation(range.Cells.Value2[rCnt, cCnt]);
//                if (turnoverItem.Dealer == null)
//                {
//                    log += " - пропуск";
//                    IsOK = false;
//                    break;
//                }
//            }//конец обработки дилера

//            //Обработка номера клиента (cCnt=1)
//            if (cCnt == columns.NumberInSap)
//            {
//                try
//                {
//                    turnoverItem.Number = TusroversSapNumberValidation(range.Cells.Value2[rCnt, cCnt]);
//                }
//                catch (FormatException)
//                {
//                    log += "<br />Ошибка в ячейке [" + rCnt + "," + cCnt + "] Номер SAP имеет неверный формат";
//                    IsOK = false;
//                    isAllOk = false;
//                    break;
//                }
//                if (turnoverItem.Number == 0)
//                {
//                    log += "<br />Ошибка в ячейке [" + rCnt + "," + cCnt + "] Номер SAP не найден";
//                    IsOK = false;
//                    isAllOk = false;
//                    break;
//                }
//                turnoverItem.StringNumber = rCnt;
//            }//конец обработки номера клиента

//            //Обработка названия клиента (cCnt=2)
//            if (cCnt == columns.LegalEntityName)
//            {
//                turnoverItem.LegalEntityName =
//                    TustoversDirectLegalEntitiesNameValidation(range.Cells.Value2[rCnt, cCnt],
//                                                               turnoverItem.Number);
//                if (turnoverItem.LegalEntityName == null)
//                {
//                    log += "<br />Ошибка в ячейке [" + rCnt + "," + cCnt + "] Имя Юр. Лица с номером " + turnoverItem.Number + " не найдено";
//                    IsOK = false;
//                    isAllOk = false;
//                    break;
//                }
//            }//конец обработки клиента

//            //Обработка номера материала
//            if (cCnt == columns.ProductInSap)
//            {
//                turnoverItem.SapMaterialNumber =
//                    TustoversDirectSapMaterialNamberValidation(range.Cells.Value2[rCnt, cCnt]);
//                if (turnoverItem.SapMaterialNumber == null)
//                {
//                    log += "<br />Ошибка в ячейке [" + rCnt + "," + cCnt + "] Номер материала SAP " + turnoverItem.SapMaterialNumber + " не найден";
//                    IsOK = false;
//                    isAllOk = false;
//                    break;
//                }
//            }//конец обработки номера материала

//            //Обработка оборота (cCnt=5)
//            if (cCnt == columns.Amount)
//            {
//                try
//                {
//                    turnoverItem.Amount = TurnoversDirectAmountValidation(range.Cells.Value2[rCnt, cCnt]);
//                }
//                catch (FormatException)
//                {
//                    log += "<br />Ошибка в ячейке [" + rCnt + "," + cCnt + "] Оборотс НДС имеет неверный формат(ИСКЛЮЧЕНИЕ)";
//                    IsOK = false;
//                    isAllOk = false;
//                    //break;
//                }
//                if (turnoverItem.Amount == 0)
//                {
//                    log += "<br />ПРОПУСК! - Ошибка в ячейке [" + rCnt + "," + cCnt + "] Оборотс НДС имеет неверный формат или равен 0 - этот оборот не будет загружен";
//                    IsOK = false;
//                    //isAllOk = false;
//                    //break;
//                }
//            }//конец обработки оборота

//            //Обработка даты (cCnt=6)
//            if (cCnt == columns.Period)
//            {
//                try
//                {
//                    turnoverItem.Period = TurnoversPeriodValidation(range.Cells.Value2[rCnt, cCnt]);

//                }
//                catch (Exception)
//                {
//                    log += "<br />Ошибка в ячейке [" + rCnt + "," + cCnt + "] Период имеет неверный формат(ИСКЛЮЧЕНИЕ)";
//                    IsOK = false;
//                    isAllOk = false;
//                    //break;
//                }
//                if (turnoverItem.Period == new DateTime(0))
//                {
//                    log += "<br />Ошибка в ячейке [" + rCnt + "," + cCnt + "] Период имеет неверный формат";
//                    IsOK = false;
//                    isAllOk = false;
//                    //break;
//                }
//                if (turnoverItem.Period > DateTime.Now)
//                {
//                    log += "<br />Ошибка в ячейке [" + rCnt + "," + cCnt + "] Период имеет будущее вемя";
//                    IsOK = false;
//                    isAllOk = false;
//                    //break;
//                }
//            }//конец обработки даты

//        } //конец обработки строки
//        if (IsOK)
//        {
//            log += " | " +
//                   turnoverItem.Number + " | " +
//                   turnoverItem.LegalEntityName + " | " +
//                   turnoverItem.Dealer + " | " +
//                   turnoverItem.Amount + " | " +
//                   turnoverItem.Period + " | " +
//                   turnoverItem.SapMaterialNumber + "<b> - OK</b>";

//            turnoverItemsList.Add(turnoverItem);
//        }
//    } //конец цикла обработки записей в таблице

//    #endregion

//    #region EndValidation
//    //закрытие файла
//    Log += "<br />Зактырие файла";
//    xlWorkBook.Close(true, null, null);
//    xlApp.Quit();

//    //проверка на задвоение строк в файле
//    Log += "<br />Проверка на задвоение строк: ";
//    string doubleStrings = TurnoversDoubleCheck(turnoverItemsList, true);
//    if (doubleStrings != null)
//    {
//        Log += "<br /><b>Задвоение строк: </b>" + doubleStrings;
//        isAllOk = false;
//    }
//    else
//    {
//        Log += " - OK";
//    }

//    //проверка на совпадение строк в базе данных
//    Log += "<br />Проверка на совпадение оборотов в ДБ: ";
//    List<TurnoverItem> result = TurnoversGetXlsAdnDbEqual(turnoverItemsList, 3);
//    if (result != null)
//    {
//        Log += "<br /> Совпадение строк №: ";
//        isAllOk = false;
//        foreach (var resultItem in result)
//        {
//            Log += resultItem.StringNumber + " ";
//        }
//    }
//    else
//    {
//        Log += " - OK";
//    }

//    if (!isAllOk)
//        return null;
//    Log += "<br />Проверка файла прошла успешно!";
//    return turnoverItemsList;
//    #endregion
//}
